ОЧИСТКА КЛИЕНТА: начало 2021-го и планы на будущее
Мы обещали периодически рассказывать, как мы улучшаем производительность и стабильность клиента Лиги.
Перед вами седьмая статья цикла. Первую можно прочитать здесь, вторую – здесь, третью – здесь, четвертую – здесь, пятую – здесь, а шестую – здесь.
Суть вкратце: весь первый квартал 2021 года мы готовились к обновлению Chromium Embedded Framework (CEF). Работа еще не закончена, но мы надеемся перейти на новую версию CEF к концу второго квартала – и это должно привести к заметным улучшениям.
Обновление Chromium Embedded Framework (CEF)
В прошлый раз мы говорили, что один из наших главных приоритетов – переход на новую версию Chromium Embedded Framework (CEF). Это веб-браузер, который лежит в основе архитектуры клиента Лиги. В предыдущей статье мы преуменьшили важность этого шага, поэтому сейчас расскажем обо всем подробнее. Ни одно другое изменение не принесет столько пользы, как обновление CEF. Переход не только повысит качество клиента, но и развяжет нам руки в плане других улучшений.
В последний раз мы обновляли CEF в ноябре 2019 года (до версии 74), а на момент написания этой статьи последняя версия CEF – 90. Как раз на нее мы и хотим перейти. Это принесет следующие плоды:
- Сократит количество вылетов клиента.
- Старые версии CEF не дружат с некоторым оборудованием. Судя по ранней статистике, большинство вылетов могут быть связаны с устаревшей версией CEF. Мы убеждены, что обновление снизит количество случаев аварийного завершения работы клиента.
- Повысит совместимость.
- Команда CEF тщательно тестирует новые версии на самых разных конфигурациях оборудования. Клиент Лиги сможет бесплатно воспользоваться плодами этой работы.
- Повысит производительность WebSocket.
- Клиент Лиги состоит из двух основных частей: фронтенда – то есть внешнего приложения, с которым вы взаимодействуете, – и гораздо меньшего по размеру основания, работающего "за кулисами". Основание получает данные с сервера и управляет информацией, необходимой клиенту. Примеры его задач:
- Этот игрок включил параметр "Закрывать клиент во время игры" и только что вошел в игру. Нужно закрыть фронтенд до тех пор, пока матч не закончится.
- Этот игрок только что открыл раздел "Коллекция". Какие чемпионы у него есть?
- Проще говоря, WebSocket – это труба, которая соединяет фронтенд и основание. Если сделать трубу шире и прямее, данные будут доставляться быстрее, – и в этом нам поможет новая версия CEF. Улучшения в работе WebSocket позволят повысить производительность там, где передается много данных (например, на послеигровом экране или на этапе выбора чемпионов), особенно у игроков со старым оборудованием. Вот какого прироста в скорости работы можно достичь после обновления CEF:
- В 4,1 раза быстрее на Windows.
- В 7,8 раза быстрее на Mac.
- Клиент Лиги состоит из двух основных частей: фронтенда – то есть внешнего приложения, с которым вы взаимодействуете, – и гораздо меньшего по размеру основания, работающего "за кулисами". Основание получает данные с сервера и управляет информацией, необходимой клиенту. Примеры его задач:
- Повысит скорость анимации.
- В частности, анимации, которая генерируется на основе данных, – например, в шкале опыта на послеигровом экране (и во многих других местах). Кроме того, такие виды анимации вызывают утечки памяти, поэтому улучшения в этой области позволят повысить производительность клиента в длительных сессиях.
- Повысит частоту кадров – то есть клиент будет меньше "подтормаживать" и быстрее реагировать на действия игрока.
- Упростит разработку (ускорит работу с клиентом и повысит надежность).
- Даст дополнительные способы борьбы с утечками памяти во время длительных игровых сессий.
- Позволит собирать новые статистические данные, благодаря которым мы сможем лучше понимать, сколько занимает отрисовка отдельных элементов клиента.
- Приведет к более грамотному использованию процессора.
- В 74-й версии CEF, которая сейчас используется в клиенте, появилась функция под названием "Сетевая служба". Она обрабатывает все сетевые запросы в одном потоке процессора, освобождая остальные для других задач вроде загрузки контента. Когда мы переходили на 74-ю версию, эта функция была совсем новой, и мы не стали ее трогать, потому что у нас не было времени на эксперименты. Но после грядущего обновления мы сможем начать подготовку к ее использованию в Лиге.
- Повысит производительность Javascript.
- В новых версиях Chromium значительно улучшен движок v8, который используется для обработки Javascript. Как и в случае с улучшением совместимости, мы сможем воспользоваться всеми преимуществами этого изменения, просто обновив версию CEF.
Весь прошедший квартал мы занимались обновлением веб-компонентов (технологии для встраивания видео, отображения всплывающих окон и тому подобного) до версий, совместимых с новыми выпусками CEF, чтобы последующее обновление самого фреймворка ничего не сломало. Мы хотели, чтобы эта работа прошла незаметно для игроков, и надеемся, что вы не столкнулись со странностями в работе клиента после выхода последних обновлений. Эти изменения затрагивают значительный объем кода, поэтому избежать мелких проблем не удалось, но мы решаем их по мере обнаружения.
Через несколько недель мы закончим работать с веб-компонентами и приступим непосредственно к обновлению CEF, которое надеемся завершить до конца июля 2021 года.
Социальная панель
В прошлой статье мы упоминали социальную панель. В долгосрочной перспективе мы хотим перевести ее с ComponentsJS (старая архитектура) на Ember. Сейчас этот проект поставлен на паузу, потому что все силы брошены на обновление CEF, однако ранее мы провели кое-какие подготовительные работы, необходимые для перехода на Ember. Мы вернемся к социальной панели, когда закончим с CEF.
Прежде чем начать подготовку к переходу на новую версию CEF, мы успели решить следующие серьезные проблемы:
- Социальная панель не подключается к серверу.
- Список друзей не загружается, отображаются некорректные статусы, в списке отсутствуют некоторые друзья./li>
- Когда друг играет в обычной очереди, с его карточки пропадает информация о ранге.
- Во время загрузки клиента в списке друзей попеременно отображается то статус "Отключен", то грустный поро.
Потребление памяти и исключения Javascript
Мы также продолжаем следить за количеством памяти, потребляемой во время матчей в каждой сессии. Рады сообщить, что с момента выхода обновления 10.25 клиент стал потреблять почти на 30 МБ меньше за каждую игру, а количество вылетов, вызванных нехваткой памяти, стабильно сокращается.
В завершение мы хотели бы поговорить об исключениях Javascript. В прошлой статье мы назвали неверное количество исключений, с которыми сталкивались игроки в регионах Riot. В цикле 10.25 их было аж 265 миллионов. Это пугающая цифра, но не забывайте, что фактическое количество исключений не изменилось – поменялись только наши методы подсчета. Впрочем, это лишь подчеркивает важность проблемы. С тех пор мы уменьшили число исключений до 140 миллионов за цикл и продолжаем работать в этом направлении.
Дальнейшие планы
Сейчас у нас в приоритете обновление CEF, но мы уже строим планы и на вторую половину 2021 года.
- Перевести социальную панель на Ember (о чем мы рассказывали выше).
- Улучшить послеигровой экран. В 2020 году и в начале 2021-го мы исправили несколько серьезных проблем с производительностью на послеигровом экране, однако работа еще не закончена. Игроки по-прежнему жалуются на слишком медленное возвращение в клиент после окончания игры и/или зависание послеигрового экрана. Когда придет черед этого проекта, мы составим схему всех взаимодействий клиента с внутриигровым движком и службами, а затем будем решать, что нужно сделать. Послеигровой экран взаимодействует с множеством служб, за которые отвечают другие команды Riot, поэтому мы будем сотрудничать с коллегами, чтобы исправить проблемы в точках соприкосновения.
- Решить проблему с поздним попаданием на экран выбора чемпиона. В некоторых регионах этот вопрос стоит особенно остро – а значит, проблема связана с качеством соединения у игроков (уровень развития инфраструктуры интернета в разных регионах может отличаться). Мы не в состоянии решить проблемы с местными сетями, однако сделаем все, что от нас зависит, и вместе с командой, отвечающей за соревновательную часть игры, будем работать над тем, чтобы все игроки попадали на экран выбора чемпиона в разумные сроки.
- Повысить стабильность клиента в длительных сессиях. В конце прошлого года мы в экстренном порядке переключились на устранение утечек памяти, которые возникали, когда пользователи играли несколько матчей подряд или оставляли клиент открытым на долгое время. В будущем мы вернемся к этой проблеме: в идеале клиент всегда должен функционировать так, словно его только что запустили, независимо от количества сыгранных матчей или времени работы. Предполагаемое решение – удвоить наши усилия, чтобы устранить самые сложные причины возникновения утечек. Однако сначала мы рассмотрим более быстрые варианты.
На этом пока все! Напоминаем, что для нашей работы очень важны отзывы игроков, полученные из разных источников – например, с помощью опросов. Продолжайте рассказывать, какие составляющие клиента требуют самого пристального внимания и какие изменения для вас важнее всего!