Поддержка DirectX11 уже скоро появится в Guild Wars 2

Джеймс Фулоп рассказал о подробностях переработки игрового движка и переходе на DirectX11. Почему было принято такое решение, когда ближайший тест и куча технической информации ждут вас в статье ниже!

С вами Джеймс Фулоп, старший программист движка игры команды Guild Wars 2. Поддержка DirectX11 — это проект, очень долгое время находившийся в разработке. В этой статье я хочу рассказать о некоторых технических решениях высокого уровня, которые были приняты для определения формы этого проекта, а также пройдусь по графической среде выполнения и поделюсь тем, как рендерер с DirectX11 влияет на производительность.

Бета-тест начнется 21 сентября 2021 года. Вы сможете присоединиться к бете прямо в игре в меню Graphics Options. Изменение вступит в силу после перезапуска игры.

Итак, какова же основная причина, из-за которой мы решили перейти на DirectX11?
Производительность клиента для нас находится в приоритете, и мы хотим, чтобы все могли играть с максимально возможной частотой кадров. Мы заметили, что иногда игра притормаживает, ожидая завершения процесса рендера. Guild Wars 2 вышла девять лет назад, и внедрение некоторых зависящих от DirectX11 функций, может помочь игре оставаться красивой в течение еще долгого времени.

Кроме того, DirectX11 предлагает некоторые современные технологические возможности, недоступные в DirectX9. Обновление до DirectX11 — первый шаг к возможности делать что-то более красивое.

После тщательного исследования мы решили интегрировать в Guild Wars 2 опенсурсную библиотеку рендеринга BGFX. BGFX хорошо написана, поддерживает различные графические бэкенды и уже используется во многих играх по всему миру. Больше о ней можно узнать на официальном сайте.

Поскольку графические экосистемы в компьютерной индустрии продолжают развиваться, BGFX позволяет нам работать совместно, как сообществу инженеров рендеринга, а не изобретать колесо по новой в каждой отдельно взятой студии. ArenaNet вносит и будет продолжать вносить свой вклад в развитие BGFX.

Мы решили использовать DirectX11, а не DirectX12 или Vulkan, потому что обнаружили, что переход на DirectX11 в BGFX обеспечивает достаточный прирост производительности, чтобы графический бэкенд более не являлся ограничивающим фактором для производительности клиента. DirectX11 очень стабилен и уже почти десять лет используется в тысячах игр. Он позволяет обеспечить поддержку вплоть до Windows Vista, в то время как поддержка Vulkan начинается с Windows 7, а DirectX12 — с Windows 10. Что же касается графических особенностей, то переход от DirectX9 к DirectX11 даст нам много возможностей для добавления интересных функций в движок в ближайшие годы. А поддержка более одного подобного бэкенда приведет к сильному увеличению объема работы по контролю качества при незначительной ощутимой пользе.

Текущий рендерер DirectX9 не изменялся сколь-либо существенно. Философия, которой я придерживался при работе над этой задачей, заключалась в том, чтобы рендерер DirectX11 выглядел так же, как DirectX9. Если бы я вносил изменения в оба рендера одновременно, то потерялась бы основа того, как все должно выглядеть. В конце концов, рендер DirectX9 будет признан устаревшим, а затем удален, когда новый рендерер станет стабильным.

Погружение в кадр

Теперь я хотел бы перейти к тому, как рендерер DirectX11 влияет на производительность игры. Начнем с основ: видеоигры по сути работают так же, как и фильмы, — вы видите неподвижные изображения, которые быстро меняются у вас перед глазами. Каждую такую картинку мы называем кадром. Именно от этого процесса происходит термин «кадры в секунду» (FPS). Чем выше FPS, тем плавнее выглядит действие на экране, пока вы не достигнете физического предела вашего дисплея. Процесс непрерывного реагирования на вводимые данные (клавиатура и мышь) и создания кадров называется «игровой цикл» (game loop).

Ниже представлено несколько визуализаций временной шкалы игрового цикла. Я снимаю эти данные с показанной на скриншоте выше локации в Lion’s Arch, используя настройки графики Best Appearance (наилучший внешний вид).

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

Для этого теста я использую процессор Intel I7-6700 и GPU Nvidia 1080.

Выше вы видите скриншот из используемого нами инструмента визуализации под названием Telemetry, разработанного компанией RAD Game Tools. Здесь визуализируется, как работа игры распределяется по ядрам вашего процессора. Время представлено в горизонтали. На скриншоте можно увидеть два кадра из игровой логики. Для простоты и наглядности я скрыл многие идентификаторы.

Каждый горизонтальный ряд представляет собой логический поток. Здесь вы видите, что у меня шесть рабочих потоков. Мы регулируем количество рабочих потоков в зависимости от того, сколько потоков поддерживает ваш процессор. Мой чип поддерживает восемь аппаратных потоков, поэтому игра делит их на один игровой поток, один поток рендеринга и шесть рабочих потоков. Учитывайте, что в Guild Wars 2 есть и другие работающие потоки, которые я здесь не показываю. Они не особенно требовательны к процессору и не относятся к данной статье.

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

Логические кадры (Logical frames) — моменты, в которых мы считаем игровой цикл перезапущенным. Вертикальные линии отмечают начало логических кадров. Аппаратные средства ввода (например, клавиатура/мышь) запрашиваются именно в этот момент в самом начале.

Здесь происходит зацикливание графического кадра. Поскольку в начале игрового кадра рендеринг еще не выполняется, мы позволяем части работы из последнего кадра перейти в следующий, чтобы выполнить как можно больше параллельных вычислений. Однако в какой-то момент все же нужно дождаться, когда последний кадр будет завершен, чтобы начать передачу работы для следующего кадра. Здесь вы могли заметить красный рабочий блок на главном потоке, который совпадает с частью завершения работы на потоке рендеринга. Это как раз тот момент, который мы хотим устранить. Игровой поток никогда не должен ждать завершения работы рендеринга.

Примечание: в основном потоке есть еще несколько красных блоков гораздо меньшего размера. Это основной поток ожидает завершения обработки рабочего потока.

На этом моменте составляются подробные списки инструкций для выполнения потоком рендеринга. Когда блок обобщенной работы по рендерингу сформирован, он передается потоку рендеринга.

Поток рендеринга преобразует работу рендеринга в специфику графического бэкенда (OpenGL или DX9).

Кадры бета-рендерера DX11

А вот как выглядит в профайлере новый рендерер.

Расположение потоков такое же.

Главному потоку больше не требуется ждать завершения потока рендеринга! Это достигается благодаря тому, как устроен BGFX. Вызовы отрисовки собираются в игровом потоке. (И в рабочих потоках тоже, мы еще поговорим об этом). Затем, когда кадр заканчивается, BGFX обрабатывает эти вызовы в своем потоке рендеринга. Теперь у нас огромный простор для отрисовки!

Преобразование данных из рендеринга в очереди в вызовы BGFX происходит параллельно в рабочих потоках.

Вот и все! Для меня это был очень интересный проект. Я с нетерпением жду технологичного будущего для Guild Wars 2.

Пожалуйста, не забывайте рассказывать нам на форуме, как работает бета-версия DirectX11.

До встречи в Тирии!

-Джеймс Фулоп

5 2 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии