12 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Проблемы с производительностью в игре XCOM 2

Проблемы с производительностью в игре XCOM 2

Привет! Меня зовут Александр, я руководитель программистов компьютерной графики в Gaijin в проектах CRSED и Enlisted. Иногда, в свободное время, я исследую как устроена графика в других играх и нахожу там что-то интересное.

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

Ниже представлена расшифровка этого видео.

Вероятно, вы играли в игру XCOM 2 или хотя бы слышали о ней. Она вышла в 2016 году. Сделана на движке Unreal Engine 3.5. Если оценивать XCOM как игру в целом, мне она понравилась. Увлекательный геймплей, приятная картинка, интересная история.

Единственная проблема, с которой я столкнулся, — это низкий FPS, в особенности на кадрах с выстрелами крупным планом. На базе и в тактическом виде эта проблема менее заметна. Средний FPS у меня был в районе 25-30. И мне стало интересно, выжимает ли игра все доступные мощности из моей ноутбучной GTX 1050 или можно сделать лучше. Сейчас я покажу вам 6 оптимизаций, которые могли помочь разработчикам улучшить производительность данной игры.

Захват кадров

Для анализа графики я использовал RenderDoc версии 1.12. Он без проблем захватил несколько кадров, которые я потом просмотрел. Я взял один кадр из меню, кадр базы, кадр на тактической карте и кадр с выстрелом.

Статья в тему:  Как удалить аккаунт из tooligram

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

«Жирный» G-buffer

Первая оптимизация связана с уменьшением размера G-buffer’а. Самый долгий проход — это заполнение G-buffer’а (>16 мс). Это видно как на таймингах различных проходов, так и на общем таймлайне.

Всего в G-buffer входит 5 текстур в формате RGBA16F, то есть текстуры имеют 4 16-битных канала и содержат вещественные числа.

Для разрешения 1080 требуется около 80 Мбайт видеопамяти для всего этого, что не так уж и много для современных видеокарт, но проблема в том, что все эти текстуры нужно заполнить. Запись в текстуру намного дороже чем чтение, поэтому много используемых текстур — это норма, а много рендертаргетов — уже не очень хорошо.

Итак, G-buffer содержит следующие текстуры:

Цвета эмиссивных (т.е. светящихся) материалов (причём альфа-канал этой текстуры пустой).

Альбедо или просто цвет без учета освещения (альфа-канал содержит Ambient Occlusion).

Нормали (в альфа-канале хранится номер одного из 4 материалов)

Параметры материалов (цвет металла + roughness).

Дополнительные нормали для анизотропных материалов (транслюсентность в альфа-канале — это параметр, показывающий насколько поверхность пропускает свет сквозь себя)

У текстуры эмиссива можно было бы удалить четвертый канал. И тем самым вместо 16 Мб потребуется 12 Мб.

Текстуру альбедо вполне можно было бы хранить как 4 8-битных канала с нормализованными вещественными числами (то есть числами от 0 до 1). Это уменьшило бы эту текстуру в 2 раза. До 8 Мб.

Статья в тему:  Как удалить аккаунт frontier

Нормали хранятся в сыром виде. Можно упаковывать их при записи, тем самым снижая количество данных, и распаковывать при чтении [Подробнее можно прочитать тут]. Это, конечно, требует больше времени на выполнение кода, но существенно снижает количество требуемых данных.

Материал принимает всего 4 различных значения, значит, отлично пакуется в 2 бита. Предположим, что эти два бита мы положили к параметрам материалов. Тогда для нормалей остаются 2 канала по 16 бит каждый. Всего 8 Мб для моего разрешения экрана.

Параметры материалов оставим без изменения, за исключением кодирования номера материала в эту же текстуру.

Последняя текстура — параметры для транслюсентных материалов. Первые 3 компоненты — это единичные векторы, значит, их тоже можно закодировать в 2 вещественных числа. Остаётся 3 канала. Причём транслюсентные материалы не эмиссивные. По крайней мере, в захваченных кадрах я такого не видел. Значит, можно объединить эту текстуру с текстурой эмиссива, и на неё мы теперь тратим 0 Мб.

Итого, нам нужно 12 Мб для эмиссива и транслюсентности, 8 Мб для диффуза, 8 Мб для нормалей и 16 для параметров материалов. Всего 44 Мб. Почти в два раза меньше памяти. Думаю, это сильно бы ускорило проход для заполнения G-buffer.

Отсутствие объектов в предварительном проходе

Другая оптимизация, которая могла бы уменьшить количество записываемых данных в G-buffer, — это более агрессивное использование предварительного прохода (prepass). Prepass — это предварительная отрисовка сцены в буфер глубины. Выполняется она с целью уменьшить количество перезаписей пикселей G-buffer’а за счёт отбрасывания пикселей, не прошедших тест глубины. Текущий предварительный проход оптимизирует отрисовку, но можно добиться и лучших результатов.

Статья в тему:  Как восстановить аккаунт убер

При записи G-buffer’а некоторые пиксели перерисовываются до 24 раз.

Судя по вызовам драйвера, между prepass’ом и G-buffer пассом нет никаких копирований текстуры глубины или чтений этой текстуры на CPU. Значит, теоретически, всю геометрию, которая рисуется в G-buffer, можно было нарисовать в prepass’е. Таким образом, можно было бы сделать ещё быстрее. И учитывая, что это самый долгий проход во всём кадре, оптимизация не была бы лишней.

Не используется инстанцирование

Оставим пиксельные оптимизации и обратимся к геометрии. Как вы могли заметить (обратите внимание на вызовы DrawIndexed на предыдущем скриншоте), объекты рисуются строго по одному. Это связано с тем, что для отрисовки используется вызов DrawIndexed вместо DrawIndexedInstanced, который позволяет рисовать несколько одинаковых объектов за раз.

А одинаковых объектов тут много. Не вдаваясь в подробности выполнения отдельных вызовов отрисовки и того, в каком порядке и как видеокарта их выполняет, хочу отметить, что при использовании инстанцирования потребовалось бы намного меньше вызовов функций DirectX, а значит меньше команд отправлялось бы на видеокарту. Уже это могло бы дать прирост FPS.

Level of Details

И последняя оптимизация связанная с рисованием сцены — это система level of details. Нет смысла рисовать детализированную геометрию, если она вдалеке и занимает пару десятков пикселей.

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

Статья в тему:  Как взломать аккаунт warframe

Использование менее детальной геометрии могло бы заметно уменьшить количество рисуемых треугольников. Естественно, это ускорило бы рендер.

Полноэкранный SSAO (Screen Space Ambient Occlusion)

Второй по длительности проход после заполнения G-buffer’а — это подготовка текстуры SSAO. Она занимает от 8 до 10 мс. И проблема этого прохода в том, что он полноэкранный.

Как я рассказывал на стриме по GTAO, подобные эффекты лучше делать в половинном разрешении экрана. У профессионалов из Activision Blizzard получилось уместить отрисовку AO в половину миллисекунды. Они замеряли на PlayStation 4, а я на ноутбуке и сравнивать время таким образом не до конца корректно. Тем не менее отмечу, что у моей видеокарты в 2.5 раза меньше GFLOPS, а вычисление AO в игре медленнее в 20 раз чем в статье от Blizzard. В общем, думаю можно сделать вывод, что полноэкранный проход для AO может быть значительно ускорен.

Depth of Field

И последнее очевидное узкое место — это depth of field. В XCOM реализован очень интересный подход к этому эффекту. Рисуются 3 миллиона треугольников. Каждый из них соответствует пикселю текстуры в половинном разрешении экрана.

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

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

Статья в тему:  Как восстановить аккаунт гостя в pubg mobile

Чтобы ускорить данный алгоритм, можно использовать компьют шейдер. Тогда для каждого текселя шейдер будет выполнен один раз.

Регистрация

Зарегистрироваться в War Thunder любой пользователь может полностью бесплатно. При этом ему будет создан личный кабинет, где он в дальнейшем сможет управлять своей учетной записью. Существует 2 основных способа создать аккаунт в игре – пройти стандартную регистрацию или воспользоваться ускоренной процедурой с помощью профиля в одной из соцсетей.

Рассмотрим процесс стандартной регистрации в игре по шагам:

1. Зайти на официальный сайт проекта и нажать на кнопку «Регистрация».

2. Заполнить короткую анкету. Потребуется указать желаемое имя пользователя, пароль и согласиться с лицензионным соглашением.

3. Активировать учетную запись. Для этого потребуется перейти по ссылке из письма.

Для регистрации с использованием данных из социальной сети нужно нажать на соответствующий значок над формой для ввода информации о пользователе. Система запросит разрешение на использование данных из профиля.

Объявления покупки аккаунта

Нужен только он,если же есть пантера 2 то только лучше. https://vk.com/iddnobydetmoim вот моя страница вк.

Нужен аккаунт с 3мя выкаченными ветками танков и самолётов(желательно ссср сша германия) и акционными машинами кв1э(немецкий), пума, 279 , ис-7, писать в лс, о цене договоримся

Интересует аккаунт с Е-100, бюджет — 25.000. Полная перепривязка с передачей почты обязательна. Пишите в ЛС. Спасибо!

продам акк с маусом и прокаченными германией

Статья в тему:  Как разблокировать временно заблокированный аккаунт

С полным доступом к аккаунту. Бюджет 2000 рублей

Куплю максимально вкаченный по веткам акк. Обязательны топы наземки основных веток. Обязательная передача почты!

Нужен жир с выкаченной наземкой у бритов, Франции, Японии, Германии/Швеции и США, авиация не интересует, рассмотрю предложения до 6000. Стата не важна. Профиль должен быть чистым без привязок,с почтой

Требуется акк с техникой 6-7 ранга (Немцы и СССР)

Куплю аккаунт с танками 6-7 ранга германии или сша или италии

Есть 8 топов и 10 премов среди них чифтейн мк 6 и много других премов меняемся без почты и акк тунлры нужен с хорошо прокаченной наземкой авиация не интересует

Писать в вк https://vk.com/markkill Или в тг @Mark39rus На авиацию пох! Главное чтобы выкачена была вся наземка. Бюджет 5к!

продаю с почтой, все скрины аккаунта в ВК(профиль открытый) id119476297, заходите смотрите, заинтересовавшиеся пишите

Возьму аккаунт в аренду с топами СССР или США на несколько дней

подарю акк жир за бесплатно

Личный аккаунт с збт с почтой. Практически все исследовано. Кто готов купить? Если нет таких, то нафиг отменю лот. Надоело уже ждать.

Остальное не важно. Цена договорная (не более 3000р), писать в лс

Продаю аккаунт War Thuhder, из доната немецкие танки Churchill, и Ru 251, по немецкой ветке вкачаны танки до 5го ранга, и самолеты истребители. Либо обмен на аккаунт в WOT — минимум с 2мя 10ками

Интересует аккаунт с немецким танком Maus, и вместе с почтой/перепривязкой.

Статья в тему:  Как добавить аккаунт в unum

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

Если пользователь забыл пароль для входа в игру War Thunder и личный кабинет, то ему не придется проходить регистрацию снова и терять все достижения. Он может вернуть доступ к учетной записи, воспользовавшись ссылкой «Забыли пароль?», на странице авторизации.

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

Возможности личного кабинета

В кабинете пользователя после первой авторизации предлагает подключить двухфакторную авторизацию. Она позволяет повысить безопасность аккаунта и увеличить время жизни сессии с 1 до 30 дней. Двухфакторная авторизация подразумевает ввод дополнительного кода из письма на электронный ящик или SMS. Настроить ее можно в меню «Безопасность», перейдя к разделу «Защита аккаунта». Это рекомендуется сделать обязательно, чтобы иметь доступ ко всем функциям.

В профиле пользователю доступны следующие возможности:

  • просмотр истории покупок и подарков (отправленных и полученных);
  • пополнение баланса с помощью различных платежных систем;
  • ввод кодов для получения различных бонусов;
  • настройка подписок;
  • управление безопасностью и паролями;
  • смена ника.

Проблемы с производительностью в игре XCOM 2

Привет! Меня зовут Александр, я руководитель программистов компьютерной графики в Gaijin в проектах CRSED и Enlisted. Иногда, в свободное время, я исследую как устроена графика в других играх и нахожу там что-то интересное.

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

Статья в тему:  Как создать аккаунт в h1z1

Ниже представлена расшифровка этого видео.

Вероятно, вы играли в игру XCOM 2 или хотя бы слышали о ней. Она вышла в 2016 году. Сделана на движке Unreal Engine 3.5. Если оценивать XCOM как игру в целом, мне она понравилась. Увлекательный геймплей, приятная картинка, интересная история.

Единственная проблема, с которой я столкнулся, — это низкий FPS, в особенности на кадрах с выстрелами крупным планом. На базе и в тактическом виде эта проблема менее заметна. Средний FPS у меня был в районе 25-30. И мне стало интересно, выжимает ли игра все доступные мощности из моей ноутбучной GTX 1050 или можно сделать лучше. Сейчас я покажу вам 6 оптимизаций, которые могли помочь разработчикам улучшить производительность данной игры.

Захват кадров

Для анализа графики я использовал RenderDoc версии 1.12. Он без проблем захватил несколько кадров, которые я потом просмотрел. Я взял один кадр из меню, кадр базы, кадр на тактической карте и кадр с выстрелом.

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

«Жирный» G-buffer

Первая оптимизация связана с уменьшением размера G-buffer’а. Самый долгий проход — это заполнение G-buffer’а (>16 мс). Это видно как на таймингах различных проходов, так и на общем таймлайне.

Статья в тему:  Как поменять аккаунт почты на айфоне

Всего в G-buffer входит 5 текстур в формате RGBA16F, то есть текстуры имеют 4 16-битных канала и содержат вещественные числа.

Для разрешения 1080 требуется около 80 Мбайт видеопамяти для всего этого, что не так уж и много для современных видеокарт, но проблема в том, что все эти текстуры нужно заполнить. Запись в текстуру намного дороже чем чтение, поэтому много используемых текстур — это норма, а много рендертаргетов — уже не очень хорошо.

Итак, G-buffer содержит следующие текстуры:

Цвета эмиссивных (т.е. светящихся) материалов (причём альфа-канал этой текстуры пустой).

Альбедо или просто цвет без учета освещения (альфа-канал содержит Ambient Occlusion).

Нормали (в альфа-канале хранится номер одного из 4 материалов)

Параметры материалов (цвет металла + roughness).

Дополнительные нормали для анизотропных материалов (транслюсентность в альфа-канале — это параметр, показывающий насколько поверхность пропускает свет сквозь себя)

У текстуры эмиссива можно было бы удалить четвертый канал. И тем самым вместо 16 Мб потребуется 12 Мб.

Текстуру альбедо вполне можно было бы хранить как 4 8-битных канала с нормализованными вещественными числами (то есть числами от 0 до 1). Это уменьшило бы эту текстуру в 2 раза. До 8 Мб.

Нормали хранятся в сыром виде. Можно упаковывать их при записи, тем самым снижая количество данных, и распаковывать при чтении [Подробнее можно прочитать тут]. Это, конечно, требует больше времени на выполнение кода, но существенно снижает количество требуемых данных.

Материал принимает всего 4 различных значения, значит, отлично пакуется в 2 бита. Предположим, что эти два бита мы положили к параметрам материалов. Тогда для нормалей остаются 2 канала по 16 бит каждый. Всего 8 Мб для моего разрешения экрана.

Статья в тему:  Как перенести аккаунт мортал комбат

Параметры материалов оставим без изменения, за исключением кодирования номера материала в эту же текстуру.

Последняя текстура — параметры для транслюсентных материалов. Первые 3 компоненты — это единичные векторы, значит, их тоже можно закодировать в 2 вещественных числа. Остаётся 3 канала. Причём транслюсентные материалы не эмиссивные. По крайней мере, в захваченных кадрах я такого не видел. Значит, можно объединить эту текстуру с текстурой эмиссива, и на неё мы теперь тратим 0 Мб.

Итого, нам нужно 12 Мб для эмиссива и транслюсентности, 8 Мб для диффуза, 8 Мб для нормалей и 16 для параметров материалов. Всего 44 Мб. Почти в два раза меньше памяти. Думаю, это сильно бы ускорило проход для заполнения G-buffer.

Отсутствие объектов в предварительном проходе

Другая оптимизация, которая могла бы уменьшить количество записываемых данных в G-buffer, — это более агрессивное использование предварительного прохода (prepass). Prepass — это предварительная отрисовка сцены в буфер глубины. Выполняется она с целью уменьшить количество перезаписей пикселей G-buffer’а за счёт отбрасывания пикселей, не прошедших тест глубины. Текущий предварительный проход оптимизирует отрисовку, но можно добиться и лучших результатов.

При записи G-buffer’а некоторые пиксели перерисовываются до 24 раз.

Судя по вызовам драйвера, между prepass’ом и G-buffer пассом нет никаких копирований текстуры глубины или чтений этой текстуры на CPU. Значит, теоретически, всю геометрию, которая рисуется в G-buffer, можно было нарисовать в prepass’е. Таким образом, можно было бы сделать ещё быстрее. И учитывая, что это самый долгий проход во всём кадре, оптимизация не была бы лишней.

Статья в тему:  Как добавить аккаунт в unum

Не используется инстанцирование

Оставим пиксельные оптимизации и обратимся к геометрии. Как вы могли заметить (обратите внимание на вызовы DrawIndexed на предыдущем скриншоте), объекты рисуются строго по одному. Это связано с тем, что для отрисовки используется вызов DrawIndexed вместо DrawIndexedInstanced, который позволяет рисовать несколько одинаковых объектов за раз.

А одинаковых объектов тут много. Не вдаваясь в подробности выполнения отдельных вызовов отрисовки и того, в каком порядке и как видеокарта их выполняет, хочу отметить, что при использовании инстанцирования потребовалось бы намного меньше вызовов функций DirectX, а значит меньше команд отправлялось бы на видеокарту. Уже это могло бы дать прирост FPS.

Level of Details

И последняя оптимизация связанная с рисованием сцены — это система level of details. Нет смысла рисовать детализированную геометрию, если она вдалеке и занимает пару десятков пикселей.

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

Использование менее детальной геометрии могло бы заметно уменьшить количество рисуемых треугольников. Естественно, это ускорило бы рендер.

Полноэкранный SSAO (Screen Space Ambient Occlusion)

Второй по длительности проход после заполнения G-buffer’а — это подготовка текстуры SSAO. Она занимает от 8 до 10 мс. И проблема этого прохода в том, что он полноэкранный.

Статья в тему:  Как восстановить аккаунт гостя в pubg mobile

Как я рассказывал на стриме по GTAO, подобные эффекты лучше делать в половинном разрешении экрана. У профессионалов из Activision Blizzard получилось уместить отрисовку AO в половину миллисекунды. Они замеряли на PlayStation 4, а я на ноутбуке и сравнивать время таким образом не до конца корректно. Тем не менее отмечу, что у моей видеокарты в 2.5 раза меньше GFLOPS, а вычисление AO в игре медленнее в 20 раз чем в статье от Blizzard. В общем, думаю можно сделать вывод, что полноэкранный проход для AO может быть значительно ускорен.

Depth of Field

И последнее очевидное узкое место — это depth of field. В XCOM реализован очень интересный подход к этому эффекту. Рисуются 3 миллиона треугольников. Каждый из них соответствует пикселю текстуры в половинном разрешении экрана.

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

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

Чтобы ускорить данный алгоритм, можно использовать компьют шейдер. Тогда для каждого текселя шейдер будет выполнен один раз.

Объявления покупки аккаунта

Нужен только он,если же есть пантера 2 то только лучше. https://vk.com/iddnobydetmoim вот моя страница вк.

Статья в тему:  Как создать аккаунт в h1z1

Нужен аккаунт с 3мя выкаченными ветками танков и самолётов(желательно ссср сша германия) и акционными машинами кв1э(немецкий), пума, 279 , ис-7, писать в лс, о цене договоримся

Интересует аккаунт с Е-100, бюджет — 25.000. Полная перепривязка с передачей почты обязательна. Пишите в ЛС. Спасибо!

продам акк с маусом и прокаченными германией

С полным доступом к аккаунту. Бюджет 2000 рублей

Куплю максимально вкаченный по веткам акк. Обязательны топы наземки основных веток. Обязательная передача почты!

Нужен жир с выкаченной наземкой у бритов, Франции, Японии, Германии/Швеции и США, авиация не интересует, рассмотрю предложения до 6000. Стата не важна. Профиль должен быть чистым без привязок,с почтой

Требуется акк с техникой 6-7 ранга (Немцы и СССР)

Куплю аккаунт с танками 6-7 ранга германии или сша или италии

Есть 8 топов и 10 премов среди них чифтейн мк 6 и много других премов меняемся без почты и акк тунлры нужен с хорошо прокаченной наземкой авиация не интересует

Писать в вк https://vk.com/markkill Или в тг @Mark39rus На авиацию пох! Главное чтобы выкачена была вся наземка. Бюджет 5к!

продаю с почтой, все скрины аккаунта в ВК(профиль открытый) id119476297, заходите смотрите, заинтересовавшиеся пишите

Возьму аккаунт в аренду с топами СССР или США на несколько дней

подарю акк жир за бесплатно

Личный аккаунт с збт с почтой. Практически все исследовано. Кто готов купить? Если нет таких, то нафиг отменю лот. Надоело уже ждать.

Остальное не важно. Цена договорная (не более 3000р), писать в лс

Статья в тему:  Как удалить аккаунт frontier

Продаю аккаунт War Thuhder, из доната немецкие танки Churchill, и Ru 251, по немецкой ветке вкачаны танки до 5го ранга, и самолеты истребители. Либо обмен на аккаунт в WOT — минимум с 2мя 10ками

Интересует аккаунт с немецким танком Maus, и вместе с почтой/перепривязкой.

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

Установка игры

Сразу после регистрации пользователю будет предложено загрузить лаунчер Вар Тандер. Для установки игры нужно просто запустить скаченный файл и следовать подсказкам системы. В дальнейшем можно также в любой момент скачать игру и войти в нее, воспользовавшись ранее созданной учетной записью. Ссылка на приложения для разных систем доступна в меню «Игра» в разделе «Скачать игру».

Если пользователь забыл пароль для входа в игру War Thunder и личный кабинет, то ему не придется проходить регистрацию снова и терять все достижения. Он может вернуть доступ к учетной записи, воспользовавшись ссылкой «Забыли пароль?», на странице авторизации.

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

Проблемы с производительностью в игре XCOM 2

Привет! Меня зовут Александр, я руководитель программистов компьютерной графики в Gaijin в проектах CRSED и Enlisted. Иногда, в свободное время, я исследую как устроена графика в других играх и нахожу там что-то интересное.

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

Статья в тему:  Как восстановить аккаунт убер

Ниже представлена расшифровка этого видео.

Вероятно, вы играли в игру XCOM 2 или хотя бы слышали о ней. Она вышла в 2016 году. Сделана на движке Unreal Engine 3.5. Если оценивать XCOM как игру в целом, мне она понравилась. Увлекательный геймплей, приятная картинка, интересная история.

Единственная проблема, с которой я столкнулся, — это низкий FPS, в особенности на кадрах с выстрелами крупным планом. На базе и в тактическом виде эта проблема менее заметна. Средний FPS у меня был в районе 25-30. И мне стало интересно, выжимает ли игра все доступные мощности из моей ноутбучной GTX 1050 или можно сделать лучше. Сейчас я покажу вам 6 оптимизаций, которые могли помочь разработчикам улучшить производительность данной игры.

Захват кадров

Для анализа графики я использовал RenderDoc версии 1.12. Он без проблем захватил несколько кадров, которые я потом просмотрел. Я взял один кадр из меню, кадр базы, кадр на тактической карте и кадр с выстрелом.

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

«Жирный» G-buffer

Первая оптимизация связана с уменьшением размера G-buffer’а. Самый долгий проход — это заполнение G-buffer’а (>16 мс). Это видно как на таймингах различных проходов, так и на общем таймлайне.

Статья в тему:  Как взломать аккаунт warframe

Всего в G-buffer входит 5 текстур в формате RGBA16F, то есть текстуры имеют 4 16-битных канала и содержат вещественные числа.

Для разрешения 1080 требуется около 80 Мбайт видеопамяти для всего этого, что не так уж и много для современных видеокарт, но проблема в том, что все эти текстуры нужно заполнить. Запись в текстуру намного дороже чем чтение, поэтому много используемых текстур — это норма, а много рендертаргетов — уже не очень хорошо.

Итак, G-buffer содержит следующие текстуры:

Цвета эмиссивных (т.е. светящихся) материалов (причём альфа-канал этой текстуры пустой).

Альбедо или просто цвет без учета освещения (альфа-канал содержит Ambient Occlusion).

Нормали (в альфа-канале хранится номер одного из 4 материалов)

Параметры материалов (цвет металла + roughness).

Дополнительные нормали для анизотропных материалов (транслюсентность в альфа-канале — это параметр, показывающий насколько поверхность пропускает свет сквозь себя)

У текстуры эмиссива можно было бы удалить четвертый канал. И тем самым вместо 16 Мб потребуется 12 Мб.

Текстуру альбедо вполне можно было бы хранить как 4 8-битных канала с нормализованными вещественными числами (то есть числами от 0 до 1). Это уменьшило бы эту текстуру в 2 раза. До 8 Мб.

Нормали хранятся в сыром виде. Можно упаковывать их при записи, тем самым снижая количество данных, и распаковывать при чтении [Подробнее можно прочитать тут]. Это, конечно, требует больше времени на выполнение кода, но существенно снижает количество требуемых данных.

Материал принимает всего 4 различных значения, значит, отлично пакуется в 2 бита. Предположим, что эти два бита мы положили к параметрам материалов. Тогда для нормалей остаются 2 канала по 16 бит каждый. Всего 8 Мб для моего разрешения экрана.

Статья в тему:  Как разблокировать временно заблокированный аккаунт

Параметры материалов оставим без изменения, за исключением кодирования номера материала в эту же текстуру.

Последняя текстура — параметры для транслюсентных материалов. Первые 3 компоненты — это единичные векторы, значит, их тоже можно закодировать в 2 вещественных числа. Остаётся 3 канала. Причём транслюсентные материалы не эмиссивные. По крайней мере, в захваченных кадрах я такого не видел. Значит, можно объединить эту текстуру с текстурой эмиссива, и на неё мы теперь тратим 0 Мб.

Итого, нам нужно 12 Мб для эмиссива и транслюсентности, 8 Мб для диффуза, 8 Мб для нормалей и 16 для параметров материалов. Всего 44 Мб. Почти в два раза меньше памяти. Думаю, это сильно бы ускорило проход для заполнения G-buffer.

Отсутствие объектов в предварительном проходе

Другая оптимизация, которая могла бы уменьшить количество записываемых данных в G-buffer, — это более агрессивное использование предварительного прохода (prepass). Prepass — это предварительная отрисовка сцены в буфер глубины. Выполняется она с целью уменьшить количество перезаписей пикселей G-buffer’а за счёт отбрасывания пикселей, не прошедших тест глубины. Текущий предварительный проход оптимизирует отрисовку, но можно добиться и лучших результатов.

При записи G-buffer’а некоторые пиксели перерисовываются до 24 раз.

Судя по вызовам драйвера, между prepass’ом и G-buffer пассом нет никаких копирований текстуры глубины или чтений этой текстуры на CPU. Значит, теоретически, всю геометрию, которая рисуется в G-buffer, можно было нарисовать в prepass’е. Таким образом, можно было бы сделать ещё быстрее. И учитывая, что это самый долгий проход во всём кадре, оптимизация не была бы лишней.

Статья в тему:  Как перенести аккаунт мортал комбат

Не используется инстанцирование

Оставим пиксельные оптимизации и обратимся к геометрии. Как вы могли заметить (обратите внимание на вызовы DrawIndexed на предыдущем скриншоте), объекты рисуются строго по одному. Это связано с тем, что для отрисовки используется вызов DrawIndexed вместо DrawIndexedInstanced, который позволяет рисовать несколько одинаковых объектов за раз.

А одинаковых объектов тут много. Не вдаваясь в подробности выполнения отдельных вызовов отрисовки и того, в каком порядке и как видеокарта их выполняет, хочу отметить, что при использовании инстанцирования потребовалось бы намного меньше вызовов функций DirectX, а значит меньше команд отправлялось бы на видеокарту. Уже это могло бы дать прирост FPS.

Level of Details

И последняя оптимизация связанная с рисованием сцены — это система level of details. Нет смысла рисовать детализированную геометрию, если она вдалеке и занимает пару десятков пикселей.

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

Использование менее детальной геометрии могло бы заметно уменьшить количество рисуемых треугольников. Естественно, это ускорило бы рендер.

Полноэкранный SSAO (Screen Space Ambient Occlusion)

Второй по длительности проход после заполнения G-buffer’а — это подготовка текстуры SSAO. Она занимает от 8 до 10 мс. И проблема этого прохода в том, что он полноэкранный.

Статья в тему:  Как удалить аккаунт из tooligram

Как я рассказывал на стриме по GTAO, подобные эффекты лучше делать в половинном разрешении экрана. У профессионалов из Activision Blizzard получилось уместить отрисовку AO в половину миллисекунды. Они замеряли на PlayStation 4, а я на ноутбуке и сравнивать время таким образом не до конца корректно. Тем не менее отмечу, что у моей видеокарты в 2.5 раза меньше GFLOPS, а вычисление AO в игре медленнее в 20 раз чем в статье от Blizzard. В общем, думаю можно сделать вывод, что полноэкранный проход для AO может быть значительно ускорен.

Depth of Field

И последнее очевидное узкое место — это depth of field. В XCOM реализован очень интересный подход к этому эффекту. Рисуются 3 миллиона треугольников. Каждый из них соответствует пикселю текстуры в половинном разрешении экрана.

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

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

Чтобы ускорить данный алгоритм, можно использовать компьют шейдер. Тогда для каждого текселя шейдер будет выполнен один раз.

Последние сделки

Особенность продажи аккаунтов Вар Тандер в том, что невозможно быстро привязать акк к почте покупателя. Разработчики данной игры специально так сделали что бы уменьшить перепродажи этих аккаунтов и не потерять прибыль. Личный кабинет Gaijin.Net имеет систему включения дополнительного емэйл, активизировав который дается возможность только через месяц удалить основной емэйл продавца. Поэтому в целях обеспечения гарантированной передачи аккаунта, покупателю лучше продать аккаунт вместе с основной почтой, либо вписать свою дополнительную которую через месяц можно сделать основной. Конечно покупатель может принять аккаунт на стадии месячной активации, дополнительно привязав к аккаунту номер телефона, в этом случае будет временно 2 владельца аккаунта. В таком случае тогда бывший хозяйн его забрать не сможет, но заходить в игру будет у его доступ, такой вариант передачи уже на честном слове. У нас на рыночной площадке продажи и покупки аккаунтов War Thunder есть специальный значок , говорящий что акк продается вместе с почтой.

Статья в тему:  Как поменять аккаунт почты на айфоне

Безопасность при продаже

Стоит напомнить о безопасности. Компания Gaijin.Net следит за своими игроками и пытается всеми возможными способами предотвратить передачу акков WT, поэтому если вы продавец, не забудьте замазать свое имя на скринах аккаунта, который будете продавать. Может возникнуть ситуация, когда аккаунт забанят у вас до продажи или еще хуже, забанят после того как купит его продавец.

Помните, что покупка и продажа аккаунтов War Thunder запрещена пользовательским соглашением самой игры, и никак НЕ запрещена законодательством как РФ так, и других русскоязычных стран. Поэтому продавайте и покупайте во благо себе.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: