Клиент EVE — история любви

- Статья

Приветствую, парни, жители Нового Эдема. Я хотел бы написать несколько слов, резюмируя некоторые плоды нашей работы над производительностью клиента и рассказывая о нашей стратегии в решении таких проблем.

Краткая версия (без технической болтовни)

С Quantum Rise мы вроде как снизили производительность клиента EVE. Это печально, но это правда...

С Quantum Rise 1.0.1 и 1.0.2 мы её снова повысили. С патчем Quantum Rise 1.0.3, выход которого запланирован на эту неделю, мы сделаем её потрясающей.

Более длинная версия (с технической болтовнёй)

Здесь и будет описана история любви, обещанная в названии. Она написана по шаблону Hero's Journey, с нашей масенькой Евой в главной роли, получившей вначале величайшую несправедливость со стороны врага (мы будем называть его мистер Баг). Во втором акте масенькая Ева начинает реализовывать свой потенциал и, в конце действия, она возвращается, чтобы уничтожить мистера Бага. Не хочу портить эффект от концовки, но он будет довольно прикольный.

Оглавление

Акт 1 — Quantum Rise 1.0.0

На протяжении последних нескольких лет мы активно совершенствуем производительность наших серверов по нескольким фронтам. Мы добавили много нового оборудования, перешли на 64-битную технологию, ввели StacklessIO и произвели большое количество настроек сервера и баз данных, значительных и не очень.

Ощущения, что кластерный сервер никогда не был таким здоровым, как сейчас, и эти ощущения основаны на фактах: лаги в Джите — в прошлом, миссионные хабы возвращены в состояние равновесия, а пару недель назад мы наблюдали на Tranquility сражение с тысячей участников. Мы очень долго о таком мечтали. В этом сражении были значительные лаги, но производительность узла снижалась элегантно (а не резко падала, как раньше) и качество обслуживания было однородным. Мы можем похвалить себя за это.

Не так быстро! После релиза расширения Quantum Rise 11 ноября (который включал в себя несколько фантастичных моментов по оптимизации сервера и базы данных), клиент похоже был обделён вниманием.

Мы получили несколько жалоб от игроков, что производительность клиента снизилась, по сравнению с тем, что было раньше. Проблема была в том, что нам не удалось получить такие же результаты на месте и это проскользнуло мимо нас до релиза. Осталось несколько мелочей. Но так бывает всегда, когда делаешь все в одиночку, разве не так?

Мы отследили большинство проблем в течение нескольких дней после выхода Quantum Rise. Некоторые из введенных в графическом движке Trinity особенностей вызывают проблемы в стрессовых ситуациях и управление ресурсами начинает работать хуже, чем раньше. Это особенно видно, когда запуск происходит на одноядерных машинах, либо — когда запущено несколько клиентов на одной машине.

Оглядываясь на прошлое, мы должны были предусмотреть такой вариант, но не предусмотрели. Излишне говорить, что первая неделя после установки Quantum Rise — совсем не то, чем можно гордиться. Мы увеличили производительность серверов и баз данных в Quantum Rise, но производительность клиента в такой же степени снизилась.

Акт 2 — Quantum Rise 1.0.1

Ладно, теперь хорошие новости. Как только нам самим удалось получить такие же проблемы производительности, мы немедленно подключили несколько очень умных людей работать над этой проблемой.

Сначала у нас были проблемы с утечками памяти, но главная проблема появлялась, когда какой-нибудь ресурс блокировался за пределами приложения. Это никак не проявлялось на многоядерных машинах, делаясь явным только при определенном стечении обстоятельств, таких как запуск двух клиентов на одноядерной машине, либо — слишком большая нагрузка на компьютер.

Итак, в субботу 22 ноября, через 11 дней после установки расширения Quantum Rise, мы установили патч 1.0.1, который был направлен на устранение ошибок в клиенте, появившихся в версии Quantum Rise 1.0.0.

Мы были очень счастливы после установки этого патча, особенно из-за того, что нам удалось установить его до выходных постреляшек (1337 раз нас расстреливали на словах, и чем дальше, тем больше были «пушки» у пользователей). Это потребовало неимоверных усилий и очень много долгих часов занятых этим команд разработчиков, но, к счастью, у нас было много сладостей, так что не всё было плохо.

Акт 3 — Quantum Rise 1.0.2

Мы много работали над патчем Quantum Rise 1.0.1, люди вечером задерживались на работе, работали по ночам и в выходные, для того, чтобы его сделать. Наша команда породила кучу исправлений в области улучшения производительности и юзабельности, которые требовали тестирования больше, чем мы могли им дать для субботнего патча. Мы не были уверены в полной безопасности этого патча, но через пару дней мы выложили еще один полный патч, как для клиента, так и для сервера, исправив им несколько некритичных ошибок.

Quantum Rise 1.0.2 был выпущен 27 ноября и содержал большое количество мелких изменений в сторону проблемы с медленной адресацией, а некоторое количество исправлений относилось к юзабилити. С релизом Quantum Rise 1.0.2 мы верили, что полностью исправили огрехи клиента, порожденные первоначальным релизом Quantum Rise.

Акт 4 — Quantum Rise 1.0.3

Несмотря на то, что производительность клиента вернулась к до-«Quantum Rise» уровню (вернулась?), мы еще не все закончили.

На этой неделе мы выпустим Quantum Rise 1.0.3, который просто напичкан исправлениями производительности. Мы провели много времени, анализируя и устраняя узкие места. Многие из этих усовершенствований адресованы в сторону старых проблем и должны сделать клиент намного быстрее, чем он был раньше.

Мы, главным образом, стремились исправить дыры, которые накапливались в клиенте с 1997 года. Эти дыры приводили к подвисанию клиента в момент, когда одновременно происходит несколько определённых вещей. С такой ситуацией игрок, в своем повседневном пользовании клиентом, практически не сталкивается. Однако, такие исправления все равно положительно повлияли на общую производительность клиента. Мы подвергаем клиент внешнему воздействию, доведя его до переломной точки, и даже более — чтобы увидеть, как именно добавленные ранее нововведения могут снижать производительность.

Несколько флотовых боёв, проведенных на тестовом сервере, позволили увидеть как обычно пользователи играют и помогли собрать информацию о специфичных способах использования клиента. Мы использовали такую информацию для того, чтобы создать новые способы тестирования клиента в экстремальных условиях флотовых боёв. И, в итоге, вся эта работа привела нас к патчу Quantum Rise 1.0.3. Несмотря на факт, что флотовые бои и сценарии различного экстремального взаимодействия были основой нашего плана атаки на производительность, мы ожидаем, что и в прочих сценариях взаимодействия производительность клиента возрастет.

Я не могу описать словами, насколько важны флотовые полеты во время тестирования и насколько важны отчеты игроков. Было замечательным наблюдать, как игроки прыгнули к месту стычки помочь нам сделать клиент лучше. Это настоящее свидетельство того, насколько сплочённо сообщество EVE.

Как бы то ни было, вернёмся к сюжету. В частности, мы проводим атаку на производительность клиента по следующим направлениям:

  • Общее описание узких мест в производительности работы с графикой
  • Узкие места, специфичные для Premium-графики
  • Узкие места в интерфейсе пользователя
  • Новые пользовательские настройки для оптимизации производительности

Общее описание узких мест в производительности работы с графикой

Когда мы воспользовались программой Intel® VTune™ Performance Analyzer, мы обратили внимание, что, при определённых условиях, в коде тратится слишком много времени на RtlReAllocateHeap (см. Kernel32.HeapReAlloc, который ссылается на NTDLL.RtlReAllocateHeap). Такие растраты времени случались не сразу и только при определённых стечениях обстоятельств и, опять же, только в Windows XP. В Windows Vista мы получили совсем другое поведение, с нормальным использованием памяти.

В реальном мире это значит, что через некоторое время после загрузки ресурсов память начинает фрагментироваться, что приводит к снижению производительности во время копирования в неё ресурсов. Во время работы клиента такое копирование происходит часто — от вывода на экран нового корабля, до загрузки меню, так что, со временем, клиент начинает работать все медленнее и медленнее. Это приводило к сильному замедлению клиента при определённом стиле игры. Такая ситуация затрагивает не каждого игрока в Windows XP, и проявляется не для любого используемого оборудования, вот почему так сложно было это обнаружить. К тому же, для тех, кто запускает клиент в Windows Vista, такой проблемы вообще не существовало.

После определенного времени исследований, мы заметили, что стандартный для Windows XP процесс динамического распределения памяти не был оптимальным для наших нужд при загрузке ресурсов. Нужно было заменить его чем-нибудь более специфичным. На эту роль хорошо подошла технология низкофрагментирующейся динамически распределяемой памяти (Low-fragmentation Heap, или LFH). Её использование сделало затраты времени при загрузке ресурсов более приемлемыми. Так же, память для ресурсов теперь отделена от памяти для остальных процессов, что позволяет осуществлять более оптимальное управление блоками данных.

Производительность клиента в Windows Vista все равно выше, чем в Windows XP, но и здесь она стала выше и ровнее, по сравнению с теми скачками, которые наблюдались раньше.

Пока мы в этом всём копались, нашими командами было отловлено еще несколько слабых мест и утечек памяти, которые можно было исправить, что, в общем, тоже привело к более оптимальному управлению ресурсами.

Узкие места, специфичные для Premium-графики

С введением Premium-клиента, который появился вместе с расширением Trinity (не путайте с введённым тогда же новым графическим движком, упомянутым ранее), появились различия в логике между Premium и Classic версиями при загрузке орудийных турелей. В Classic-версии турели загружались «лениво» (видимо, загрузка модели происходила по требованию — примечание переводчика). Однако, мы верили (и это подтверждалось опытным путём), что производительность Premium-клиента настолько высока, что использовать такую же логику загрузки в нём не требуется. Поэтому модели орудий подгружались и инициализировались сразу же после того, как родительский объект (корабль) появлялся на экране. И игрок никак не мог изменить такое поведения клиента.

Сейчас мы обнаружили, что наши изначальные предположения тесты производительности в этой области были ошибочны. В реальной жизни (то есть в космической игре) цена загрузки моделей в реальном времени очень высока. И частота смены кадров страдала из-за отрисовки большого количества турелей, а подгрузка моделей оружия, когда его очень много (например при загрузке сцены с крупным флотовым сражением), забирала вообще очень много ресурсов.

Поэтому мы делаем «ленивую» загрузку и в Premium-клиенте. Это значит, что модели орудий будут подгружаться только если выполняется хотя бы одно из следующих условий:

  • Вы выполняете команду 'look at' для корабля.
  • Корабль стреляет из своих орудий с активированным режимом 'Turret Effects' (включено по-умолчанию).

Это значит, что модели орудий не будут отображаться, пока корабль, на котором они установлены, не начнёт из них стрелять. А если вы отключите опцию «Turret Effects» в меню настроек, то вы, в основном, будете видеть турели только своего корабля.

Если вам всё-таки нужно видеть турели на корабле, достаточно будет один раз активировать на нём команду 'look at'. После этого турели будут на нём отображаться всё время, пока корабль не покинет сцену (или, локальную, для вашего корабля, систему координат — примечание переводчика).

Узкие места в интерфейсе пользователя

Мы делаем сейчас фантастические (правда — сильно запоздалые) подстройки быстродействия пользовательского интерфейса, Для патча Quantum Rise 1.0.3, самая заметная часть этого — прорисовка таких объектов, как окна и кнопки. Более редкое обращение к функции прорисовки этих объектов заметно увеличивает производительность, когда у вас открыто много окон, особенно на слабых и сильно загруженных компьютерах.

Загрузка и прорисовка брекетов тоже была оптимизирована. Теперь они будут грузиться быстрее, особенно в ситуации, когда их должно быть очень много.

Мы будем заниматься такого рода работой до конца года и, возможно, введём усовершенствования в производительности интерфейса после Нового Года, или в следующем расширении.

Новые пользовательские настройки для оптимизации производительности

Во время тестирования флотовых сражений на тестовом сервере, проводимых вместе с нашими замечательными игроками, было обнаружено несколько ограничений, которые не могут быть устранены как таковы, и проявляются только в ситуациях с сильной нагрузкой. Но помните, что, если вы занимаетесь каребирством в хайсеках (как я), вы с ними вряд ли столкнётесь. Однако, если вы собираетесь постреляться вместе с тысячей людей, вам нужно прочесть о дополнительных опциях, описанных ниже.

Мы добавили следующие опции в меню настроек:

  • Drone models: Эта опция при отключении сделает так, что ваш клиент не будет подгружать модели дронов, значительно повышая производительность, как в Classic-, так и в Premium-версиях клиента, когда вы находитесь на одной сцене с большим количеством дронов
  • Explosion Effects: Эффекты взрывов могут сильно нагружать вашу систему и вызывать подвисание, когда их слишком много на экране
  • Tactical Messages: Вы можете отключить сообщения о варп-скрамблинге, самоуничтожении и пр. Это не даст большого прироста производительности, но, как говорится, копейка рубль бережёт
  • Camera shake: Тряску камеры можно отключить. Не потому, что это влияет на производительность — просто очень многие просили сделать такую возможность

Кроме того, теперь есть возможность отключить все брекеты сразу, точно так же как их можно было включить все сразу раньше.

Если вы воспользуетесь вышеописанными опциями, то EVE будет выглядеть не так красиво, как раньше, но это может повлиять на жизнь и смерть в флотовых сражениях.

Мы вложили много усилий в Quantum Rise 1.0.3 за короткий промежуток времени. Так как там есть несколько низкоуровневых изменений, существует вероятность того, что всплывут еще какие-нибудь проблемы, но нам кажется, что людям сейчас больше подойдет патч с удивительной производительностью. К тому же это даст нам дополнительное время для того, чтобы исправить возникающие проблемы до Нового Года. Продолжайте работать с нами и после выхода этого патча, чтобы мы могли и дальше улучшать производительность и юзабельность клиента.

Диаграммы

Большинство усилий в разработке патча Quantum Rise 1.0.3 было направлено на усовершенствование процедур тестирования клиента и улучшение используемой системы показателей. Поэтому мы тестировали клиент в более широком диапазоне ситуаций, чем раньше. Это привело к тому, что было отловлено больше ошибок. Как только проблемы были найдены, они сравнительно легко были решены нашими талантливыми программистами, работающими с кусками кода, вызывающими эти проблемы.

Далее можно увидеть несколько диаграмм, которые были сгенерированы для поиска узких мест в производительности. В них сравнивается то, что было раньше и то, что получилось в результате.

Изображение 1: Пример запуска 1000 дронов «Orge» в сравнение Empyrean Age и Quantum Rise 1.0.3, плюс результат в Quantum Rise 1.0.3 при отключении моделей дронов
Изображение 1: Пример запуска 1000 дронов «Orge I» в сравнение Empyrean Age и Quantum Rise 1.0.3, плюс результат в Quantum Rise 1.0.3 при отключении моделей дронов.

Изображение 2: Та же ситуация, что и на первом изображении, но камера максимально отдалена от корабля, модели представлены с низким уровнем детализации. Теперь не наблюдается резкого падения производительности при увеличении количества моделей, так как они не отрисовываются
Изображение 2: Та же ситуация, что и на первом изображении, но камера максимально отдалена от корабля, модели представлены с низким уровнем детализации. Теперь не наблюдается резкого падения производительности при увеличении количества моделей, так как они не отрисовываются

Изображение 3: Раньше клиент подвисал примерно на минуту на тестовой машине при включении всех брекетов для 2000 кораблей. Сейчас это время снизилось до 12 секунд
Изображение 3: Раньше клиент подвисал примерно на минуту на тестовой машине при включении всех брекетов для 2 000 кораблей. Сейчас это время снизилось до 12 секунд

Изображение 4: Так как мы больше не прогружаем турели, пока они нам не понадобились, мы видим сильные изменения во времени прогрузки сцены и частоте смены кадров при варпе к кораблям с турелями
Изображение 4: Так как мы больше не прогружаем турели, пока они нам не понадобились, мы видим сильные изменения во времени прогрузки сцены и частоте смены кадров при варпе к кораблям с турелями

Изображение 5: Та же ситуация, что и на предыдущем изображении, но камера максимально отдалена от корабля. Заметно только небольшое заикание, по сравнению с Empyrean Age
Изображение 5: Та же ситуация, что и на предыдущем изображении, но камера максимально отдалена от корабля. Заметно только небольшое заикание, по сравнению с Empyrean Age

Изображение 6: Здесь мы наблюдаем эффект от оптимизации процесса загрузки ресурсов и от использования технологии низкофрагментирующейся динамически распределяемой памяти на Classic-клиенте
Изображение 6: Здесь мы наблюдаем эффект от оптимизации процесса загрузки ресурсов и от использования технологии низкофрагментирующейся динамически распределяемой памяти на Classic-клиенте

Изображение 7: Технология Low Fragmentation Heap лучше работает при использовании Premium-клиента, но прогрузка ресурсов тут и так была лучше, чем на его Classic-версии
Изображение 7: Технология Low Fragmentation Heap лучше работает при использовании Premium-клиента, но прогрузка ресурсов тут и так была лучше, чем на его Classic-версии

Изображение 8: Использование смартбомбы на большом количестве NPC одновременно. Здесь видно насколько дорогостоящи эффекты взрыва. Теперь есть возможность отключать их
Изображение 8: Использование смартбомбы на большом количестве NPC одновременно. Здесь видно насколько дорогостоящи эффекты взрыва. Теперь есть возможность отключать их

Прошу обратить внимание, что все приведённые выше примеры отображают поведение клиента в экстремальных ситуациях. Они не показывают то, что вы получите в процессе игры. Они, скорее, показывают проблемные области, на которые мы обратили внимание. Скорее всего эти графики не будут соответствовать ничему, что вы испытаете в игре.

Как было раньше сказано, изменения — шикарны. :)

Антракт — руководство по выживанию во время флотовых сражений

С тем, что мы сделали в Quantum Rise 1.0.3, флотовые сражения с тысячей людей должны теперь приносить больше удовлетворения (по крайней мере той стороне, которая выигрывает в данный момент, а для остальных бедных парней мы сделать ничего больше не можем *giggle*... кхе-кхе, извините).

Ниже приведён список вещей, которые вы должны сделать, чтобы FPS возрос хотя бы до того уровня, когда вы сможете увидеть как вас поднули. Важно сделать эти изменения до того, как вы появитесь в центре сражения, так как некоторые из этих настроек будут работать только после загрузки новой сцены. Так что, если у вас были включены какие-нибудь из тяжеловесных настроек, то ваш клиент может так и не восстановиться после варп-прыжка, пока вы не обнаружите себя на станции, где дружелюбный голос Ауры будет рассказывать вам о последних достижениях в технологии клонирования.

Если вас устраивает ваша частота смены кадров и время прогрузки с любой включённой из этих опций, можете и дальше использовать свой клиент в таком духе. Однако, если будет альтернатива между красотой и производительностью, я уверен, что вы выберете производительность. Приведённый ниже список отсортирован по приоритету, с самыми важными опциями сверху.

  • Включите отображение только тех брекетов, которые вам действительно нужны (в крайнем случае, отключите хотя бы брекеты дронов и вреков)
  • Отключите отображение моделей дронов
  • Отключите эффекты турелей
  • Максимально отдалите камеру до того, как закончится варп прыжок
  • Отключите эффекты взрывов
  • Отключите вообще эффекты
  • Отключите звук (это не касается EVE Voice, которая, по идее, не должна сильно влиять на производительность)
  • Отключите тактические сообщения и сообщения об уроне
  • Отключите тени и HDR
  • Лучше всё-таки использовать Windows Vista (множество людей могут её ненавидеть, но управление динамически распределяемой памятью там реализовано лучше)

Наверное вы заметили, что в этот список не попал пункт «играйте Classic-клиентом». До Quantum Rise 1.0.3 он возможно и входил бы в список, но в данный момент производительность двух этих клиентов находится на одном уровне. Так что, если у вас стоит современное оборудование, которое сможет поддерживать Premium-клиент, то нет никаких причин использовать Classic-версию в флотовых сражениях. Вы даже можете наблюдать более высокую производительность при использовании Premium-клиента.

Отрывок из продолжения романа

Мы и дальше будем продолжать работу над быстродействием клиента, даже после выхода патча Quantum Rise 1.0.3. У нас уже намечено несколько выдающихся правок, которые мы не можем ввести в этом клиенте только из-за нехватки времени. Но беспокойство оставьте своё, и после этого патча будут еще патчи.

Некоторые из таких правок:

  • «Ленивая» подгрузка моделей: Мы собираемся полностью устранить подвисание клиента, которое вы получаете, когда появляетесь в сцене с большим количеством объектов. То, знакомое ощущение (которое, кстати, было сильно облегчено в Quantum Rise 1.0.3), когда ваш клиент перестаёт виснуть как раз в тот момент, когда вы можете видеть своё маленькое поблёскивающее яйцо, будет полностью устранено. Это будет очень важное изменение для всех, — от флотовых воинов до тех, кто выполняет миссии для агентов, — вы будете видеть разницу между тем, что было и стало, каждый раз когда ваш варп-прыжок будет заканчиваться в сцене с большим количеством объектов
  • Еще больше увеличения производительности: Еще много работы должно быть проделано в плане оптимизации процесса прогрузки ресурсов. Мы будем его совершенствовать и упрощать часто используемые операции
  • Повышение производительности при моделировании: Мы нашли несколько узких мест в движке моделирования физики, действующей в мире EVE. Большей частью это относится к клиенту, в котором имеется своя собственная симуляционная система. Он будет в выигрыше в ситуациях, когда вокруг будет много скученных объектов
  • Более производительный пользовательский интерфейс: Много работы ведется на ниве пользовательского интерфейса, призванной повысить производительность при отображении окон и брекетов. Мы увидим заметные изменения в производительности интерфейса пользователя в самое ближайшее время

Эпилог

Мы великолепно провели время, когда вносили исправления и тесно работали с игроками над обнаружением проблем в работе клиента. Мы надеемся и дальше выпускать обновления, повышающие скорость работы клиента. Наши команды провели неоценимую работу в этом направлении, а замечательное сообщество игроков EVE было весьма терпимо и помогало нам в этот период.

В заключение, без желания показаться нескромным, я должен сказать, что с Quantum Rise 1.0.3 клиент EVE Online будет самым производительным образцом программного обеспечения, когда-либо сконструированного, за всю историю человечества. :)

Конец.

Jon Bjarnason (CCP Atlas)
Technical Director
EVE Online, CCP Games
08.12.2008