0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>19 апр 2023</li>
2
<ul><li>19 апр 2023</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><h2>Как оптимизируют графику в играх</h2>
4
</ul><h2>Как оптимизируют графику в играх</h2>
5
<p>Доклад программиста игровой графики Васифа Абдуллаева.</p>
5
<p>Доклад программиста игровой графики Васифа Абдуллаева.</p>
6
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
7
<p>Считает игры произведениями искусства и старается донести эту идею до широких масс. В свободное время стримит, рисует и часами зависает в фоторежимах.</p>
7
<p>Считает игры произведениями искусства и старается донести эту идею до широких масс. В свободное время стримит, рисует и часами зависает в фоторежимах.</p>
8
<p>В 2021 году в рамках онлайн-сессии From Zero to Game на азербайджанском портале<a>Gamepons</a>программист Васиф Абдуллаев затронул тему оптимизации графики в видеоиграх с позиции разработчика. В рамках своего выступления он объяснил, что такое оптимизация, как разработчики оптимизируют графику в играх, зачем они это делают и каких усилий им это стоит.</p>
8
<p>В 2021 году в рамках онлайн-сессии From Zero to Game на азербайджанском портале<a>Gamepons</a>программист Васиф Абдуллаев затронул тему оптимизации графики в видеоиграх с позиции разработчика. В рамках своего выступления он объяснил, что такое оптимизация, как разработчики оптимизируют графику в играх, зачем они это делают и каких усилий им это стоит.</p>
9
<p>Редакция "Геймдев" Skillbox Media делится основными тезисами этого доклада.</p>
9
<p>Редакция "Геймдев" Skillbox Media делится основными тезисами этого доклада.</p>
10
Полная версия доклада Васифа Абдуллаева<p>Более пяти лет занимается разработкой мобильных и десктопных игр в небольших инди-командах и крупных студиях. Он специализируется на программировании геймплея, шейдеров компьютерной графики и мультиплеера в движках Unity и Unreal Engine. Сейчас сотрудничает с турецкой студией Coconut Game.</p>
10
Полная версия доклада Васифа Абдуллаева<p>Более пяти лет занимается разработкой мобильных и десктопных игр в небольших инди-командах и крупных студиях. Он специализируется на программировании геймплея, шейдеров компьютерной графики и мультиплеера в движках Unity и Unreal Engine. Сейчас сотрудничает с турецкой студией Coconut Game.</p>
11
<p>Оптимизация кода или ПО - это процесс модификации системы для повышения эффективности некоторых элементов программы, а также для экономии ресурсов. В контексте оптимизации игр к ресурсам относятся графический процессор (GPU), центральный процессор (CPU), батарея смартфона, оперативная память и прочее железо.</p>
11
<p>Оптимизация кода или ПО - это процесс модификации системы для повышения эффективности некоторых элементов программы, а также для экономии ресурсов. В контексте оптимизации игр к ресурсам относятся графический процессор (GPU), центральный процессор (CPU), батарея смартфона, оперативная память и прочее железо.</p>
12
<p><strong>В разработке игр выделяют две категории оптимизации:</strong></p>
12
<p><strong>В разработке игр выделяют две категории оптимизации:</strong></p>
13
<ul><li>Оптимизация кода, которая по большей части влияет на CPU. Ею занимаются программисты, ответственные за геймплей, UI, боевую систему и прочие важные элементы игры;</li>
13
<ul><li>Оптимизация кода, которая по большей части влияет на CPU. Ею занимаются программисты, ответственные за геймплей, UI, боевую систему и прочие важные элементы игры;</li>
14
<li>Оптимизация графики - более сложный процесс, в котором задействованы оба процессора. За этот вид оптимизации отвечают программисты игровой графики и технические художники.</li>
14
<li>Оптимизация графики - более сложный процесс, в котором задействованы оба процессора. За этот вид оптимизации отвечают программисты игровой графики и технические художники.</li>
15
</ul><ul><li>Разработчик всегда заинтересован в том, чтобы его игра хорошо продавалась. Но далеко не каждый игрок может похвастаться наличием современного железа. Согласно<a>статистике</a>Steam, на март 2023 года доля систем с видеокартой NVIDIA GeForce GTX 1060 составляет 7,85% от общего числа сборок (для сравнения: у лидера NVIDIA GeForce RTX 3060 - 10,67%). Проект с современной, но неоптимизированной графикой будет сильно тормозить на системе с относительно слабой видеокартой или не запустится вовсе. А это значит, что в игру смогут сыграть далеко не все. Таким образом, оптимизация увеличивает охват аудитории.</li>
15
</ul><ul><li>Разработчик всегда заинтересован в том, чтобы его игра хорошо продавалась. Но далеко не каждый игрок может похвастаться наличием современного железа. Согласно<a>статистике</a>Steam, на март 2023 года доля систем с видеокартой NVIDIA GeForce GTX 1060 составляет 7,85% от общего числа сборок (для сравнения: у лидера NVIDIA GeForce RTX 3060 - 10,67%). Проект с современной, но неоптимизированной графикой будет сильно тормозить на системе с относительно слабой видеокартой или не запустится вовсе. А это значит, что в игру смогут сыграть далеко не все. Таким образом, оптимизация увеличивает охват аудитории.</li>
16
<li>У каждой платформы - консолей, портативных устройств, смартфонов, планшетов - своё железо. Если разработчик планирует мультиплатформенный релиз, игра должна идеально работать на всех заявленных устройствах. Поэтому её нужно оптимизировать.</li>
16
<li>У каждой платформы - консолей, портативных устройств, смартфонов, планшетов - своё железо. Если разработчик планирует мультиплатформенный релиз, игра должна идеально работать на всех заявленных устройствах. Поэтому её нужно оптимизировать.</li>
17
<li>И наконец, оптимизированная графика - залог плавного геймплея без просадки кадров, даже если в сцене много детализированных объектов.</li>
17
<li>И наконец, оптимизированная графика - залог плавного геймплея без просадки кадров, даже если в сцене много детализированных объектов.</li>
18
</ul><p><strong>Примеры игр с хорошей оптимизацией:</strong></p>
18
</ul><p><strong>Примеры игр с хорошей оптимизацией:</strong></p>
19
<ul><li>Metal Gear Solid 5: The Phantom Pain - стелс-экшен с открытым миром и динамическим освещением выдаёт 60 кадров в секунду на PS4 и Xbox One, при этом качество картинки на PS3 и Xbox 360, где игра тоже доступна, ничуть не хуже (пусть и частота кадров на этих платформах ниже).</li>
19
<ul><li>Metal Gear Solid 5: The Phantom Pain - стелс-экшен с открытым миром и динамическим освещением выдаёт 60 кадров в секунду на PS4 и Xbox One, при этом качество картинки на PS3 и Xbox 360, где игра тоже доступна, ничуть не хуже (пусть и частота кадров на этих платформах ниже).</li>
20
<li>Marvel’s Spider-Man - плавный геймплей в сочетании с детализированным открытым миром реализован как на PS4, так и на портированной ПК-версии.</li>
20
<li>Marvel’s Spider-Man - плавный геймплей в сочетании с детализированным открытым миром реализован как на PS4, так и на портированной ПК-версии.</li>
21
</ul><em>Скриншот: игра Metal Gear Solid 5: The Phantom Pain / Konami Digital Entertainment</em><em>Скриншот: игра Marvel’s Spider-Man Remastered / Insomniac Games</em><p>Важно помнить, что оптимизация графики в большей степени зависит не от навыков программиста или возможностей технологии, а от того, как работают с движком программисты игровой графики и 2D/3D-художники.</p>
21
</ul><em>Скриншот: игра Metal Gear Solid 5: The Phantom Pain / Konami Digital Entertainment</em><em>Скриншот: игра Marvel’s Spider-Man Remastered / Insomniac Games</em><p>Важно помнить, что оптимизация графики в большей степени зависит не от навыков программиста или возможностей технологии, а от того, как работают с движком программисты игровой графики и 2D/3D-художники.</p>
22
<p>Чтобы понять, как работает оптимизация графики, сперва необходимо ознакомиться с работой графических API. Это специальные интерфейсы, которые помогают разработчикам отрисовать картинку на экране. Также они задействованы в процессе рендеринга в реальном времени.</p>
22
<p>Чтобы понять, как работает оптимизация графики, сперва необходимо ознакомиться с работой графических API. Это специальные интерфейсы, которые помогают разработчикам отрисовать картинку на экране. Также они задействованы в процессе рендеринга в реальном времени.</p>
23
<p><strong>Примеры графических API:</strong></p>
23
<p><strong>Примеры графических API:</strong></p>
24
<ul><li>ПК - Vulkan, DirectX 11/12, OpenGL, Metal.</li>
24
<ul><li>ПК - Vulkan, DirectX 11/12, OpenGL, Metal.</li>
25
<li>Мобильные платформы - Vulkan, OpenGL, Metal.</li>
25
<li>Мобильные платформы - Vulkan, OpenGL, Metal.</li>
26
<li>консоли - DirectX, PSGL, GNM.</li>
26
<li>консоли - DirectX, PSGL, GNM.</li>
27
</ul><p>У каждого графического API свой синтаксис кода, язык программирования шейдеров и совместимость между устройствами. Из списка выше можно увидеть, что некоторые интерфейсы поддерживают кросс-платформенность. Но основная их логика сводится к выводу изображения на экран методом растеризации или трассировки лучей в реальном времени. Современные игровые движки поддерживают сразу несколько графических API.</p>
27
</ul><p>У каждого графического API свой синтаксис кода, язык программирования шейдеров и совместимость между устройствами. Из списка выше можно увидеть, что некоторые интерфейсы поддерживают кросс-платформенность. Но основная их логика сводится к выводу изображения на экран методом растеризации или трассировки лучей в реальном времени. Современные игровые движки поддерживают сразу несколько графических API.</p>
28
<p>Vulkan и DirectX 12 можно отнести к "современной" категории интерфейсов. Мы привыкли считать, что понятие "современный" подразумевает более упрощённый подход. Однако код рендеринга для простого треугольника в Vulkan<a>занимает</a>около 1000 строк, а в OpenGL - менее 100.</p>
28
<p>Vulkan и DirectX 12 можно отнести к "современной" категории интерфейсов. Мы привыкли считать, что понятие "современный" подразумевает более упрощённый подход. Однако код рендеринга для простого треугольника в Vulkan<a>занимает</a>около 1000 строк, а в OpenGL - менее 100.</p>
29
Рендеринг простого треугольника в OpenGL<em>Кадр:<a>Gamepons</a>/ YouTube</em><p>Всё дело в том, что такой тип API не прячет все данные в функции, а даёт разработчику гибкость для оптимизации, особенно в отношении CPU.</p>
29
Рендеринг простого треугольника в OpenGL<em>Кадр:<a>Gamepons</a>/ YouTube</em><p>Всё дело в том, что такой тип API не прячет все данные в функции, а даёт разработчику гибкость для оптимизации, особенно в отношении CPU.</p>
30
Сравнение картинки с OpenGL ES и Vulkan в движке Unity<p><strong>Примечание</strong></p>
30
Сравнение картинки с OpenGL ES и Vulkan в движке Unity<p><strong>Примечание</strong></p>
31
<p>Более подробно о преимуществах API Vulkan можно узнать из <a>спецификации</a>на сайте NVIDIA.</p>
31
<p>Более подробно о преимуществах API Vulkan можно узнать из <a>спецификации</a>на сайте NVIDIA.</p>
32
<p>Из кода Vulkan, представленного по ссылке выше, можно увидеть обилие команд. В графическом API их называют дроуколлами (от англ. DrawCall). Они отправляют центральному процессору информацию о текстурах, буферах вершин,<a>усечении</a>геометрии, шейдерах и так далее.</p>
32
<p>Из кода Vulkan, представленного по ссылке выше, можно увидеть обилие команд. В графическом API их называют дроуколлами (от англ. DrawCall). Они отправляют центральному процессору информацию о текстурах, буферах вершин,<a>усечении</a>геометрии, шейдерах и так далее.</p>
33
Дроуколлы в коде<em>Кадр:<a>Gamepons</a>/ YouTube</em><p>К слову, шейдер - это тоже тип программы для рендеринга, которая определяет итоговый вид поверхности объекта в сцене: наложение текстур, рельефность, взаимодействие со светом (поглощение, рассеивание, отражение, преломление и так далее). Шейдеры взаимодействуют с графическим ускорителем и написаны в основном на языках<a>HLSL</a>или<a>GLSL</a>. Но в большинстве случаев разработчики не взаимодействуют с кодом шейдеров напрямую, а настраивают их в движке. Например, шейдеры в Unreal Engine можно собрать с помощью нодов во встроенном редакторе.</p>
33
Дроуколлы в коде<em>Кадр:<a>Gamepons</a>/ YouTube</em><p>К слову, шейдер - это тоже тип программы для рендеринга, которая определяет итоговый вид поверхности объекта в сцене: наложение текстур, рельефность, взаимодействие со светом (поглощение, рассеивание, отражение, преломление и так далее). Шейдеры взаимодействуют с графическим ускорителем и написаны в основном на языках<a>HLSL</a>или<a>GLSL</a>. Но в большинстве случаев разработчики не взаимодействуют с кодом шейдеров напрямую, а настраивают их в движке. Например, шейдеры в Unreal Engine можно собрать с помощью нодов во встроенном редакторе.</p>
34
Визуальное программирование шейдеров в Unreal Engine 5<em>Изображение:<a>Unreal Engine 5</a></em><p>Существует очень много игровых движков со своими достоинствами и недостатками. Каждый из них имеет уникальную архитектуру и свой подход к обработке графики. Выбор в пользу той или иной технологии зависит от бюджета, платформы, жанра, геймплея и прочих составляющих.</p>
34
Визуальное программирование шейдеров в Unreal Engine 5<em>Изображение:<a>Unreal Engine 5</a></em><p>Существует очень много игровых движков со своими достоинствами и недостатками. Каждый из них имеет уникальную архитектуру и свой подход к обработке графики. Выбор в пользу той или иной технологии зависит от бюджета, платформы, жанра, геймплея и прочих составляющих.</p>
35
<p>Стоит учитывать, что сцены в игре также имеют свою специфику в плане оптимизации. Например, рендеринг густого леса и симуляция толпы людей - это разные технические процессы. Поэтому программисты игровой графики должны иметь доступ к исходному коду движка, чтобы понять, как в рамках выбранной технологии реализовать различные операции. В противном случае оптимизировать игру будет сложно.</p>
35
<p>Стоит учитывать, что сцены в игре также имеют свою специфику в плане оптимизации. Например, рендеринг густого леса и симуляция толпы людей - это разные технические процессы. Поэтому программисты игровой графики должны иметь доступ к исходному коду движка, чтобы понять, как в рамках выбранной технологии реализовать различные операции. В противном случае оптимизировать игру будет сложно.</p>
36
<p>Следует помнить, что<strong>идеального игрового движка не существует</strong>. Даже проекты на нашумевшем Unreal Engine 5 нуждаются в оптимизации по нескольким причинам:</p>
36
<p>Следует помнить, что<strong>идеального игрового движка не существует</strong>. Даже проекты на нашумевшем Unreal Engine 5 нуждаются в оптимизации по нескольким причинам:</p>
37
<ul><li>Многие до сих пор играют на слабом железе.</li>
37
<ul><li>Многие до сих пор играют на слабом железе.</li>
38
<li>Инновационная технология Nanite с возможностью отрисовки миллионов полигонов<a>не работает</a>на мелких объектах вроде растений.</li>
38
<li>Инновационная технология Nanite с возможностью отрисовки миллионов полигонов<a>не работает</a>на мелких объектах вроде растений.</li>
39
<li>Трассировка лучей или различные<a>сценарии</a>освещения могут негативно влиять на производительность.</li>
39
<li>Трассировка лучей или различные<a>сценарии</a>освещения могут негативно влиять на производительность.</li>
40
</ul><p>Рендеринг, или отрисовка изображения, производится с помощью вычислений центрального процессора. В результате игрок видит на экране набор кадров или анимацию 3D-объектов с учётом их расположения, текстурирования, освещения и других характеристик. Различают<strong>однопоточный</strong>рендеринг с синхронным воспроизведением вычислений и <strong>многопоточный</strong>, во время которого задействовано несколько ядер процессора. Во втором случае нагрузка распределяется равномерно.</p>
40
</ul><p>Рендеринг, или отрисовка изображения, производится с помощью вычислений центрального процессора. В результате игрок видит на экране набор кадров или анимацию 3D-объектов с учётом их расположения, текстурирования, освещения и других характеристик. Различают<strong>однопоточный</strong>рендеринг с синхронным воспроизведением вычислений и <strong>многопоточный</strong>, во время которого задействовано несколько ядер процессора. Во втором случае нагрузка распределяется равномерно.</p>
41
Работа центрального процессора во время рендеринга<em>Источник: Васиф Абдуллаева / Gamepons. Инфографика: Майя Мальгина для Skillbox Media</em><p>Есть два метода рендеринга на графическом процессоре - с помощью трассировки лучей и с помощью растеризации 3D-моделей. Последний более распространён, поэтому его стоит рассмотреть подробнее.</p>
41
Работа центрального процессора во время рендеринга<em>Источник: Васиф Абдуллаева / Gamepons. Инфографика: Майя Мальгина для Skillbox Media</em><p>Есть два метода рендеринга на графическом процессоре - с помощью трассировки лучей и с помощью растеризации 3D-моделей. Последний более распространён, поэтому его стоит рассмотреть подробнее.</p>
42
<p>Известно, что сцены в игре состоят из 3D-объектов. В свою очередь, каждый из них состоит из примитивов: точек, линий и треугольников (иногда квадратов). Задача программы, ответственной за растеризацию, - получить из этих исходных примитивов фрагменты (пиксели) итогового изображения.</p>
42
<p>Известно, что сцены в игре состоят из 3D-объектов. В свою очередь, каждый из них состоит из примитивов: точек, линий и треугольников (иногда квадратов). Задача программы, ответственной за растеризацию, - получить из этих исходных примитивов фрагменты (пиксели) итогового изображения.</p>
43
Общий принцип растеризации<em>Источник: Васиф Абдуллаева / Gamepons. Инфографика: Майя Мальгина для Skillbox Media</em><p>Краткое описание стадий, обозначенных на схеме выше:</p>
43
Общий принцип растеризации<em>Источник: Васиф Абдуллаева / Gamepons. Инфографика: Майя Мальгина для Skillbox Media</em><p>Краткое описание стадий, обозначенных на схеме выше:</p>
44
<ul><li><strong>Сборщик входных данных (Input Assembler)</strong> - чтение данных примитивов (точек, линий и треугольников) из заполненных буферов и сбор данных в примитивы, которые будут использоваться на следующих этапах. Также на этой стадии прикрепляются значения, созданные системой для повышения эффективности шейдеров.</li>
44
<ul><li><strong>Сборщик входных данных (Input Assembler)</strong> - чтение данных примитивов (точек, линий и треугольников) из заполненных буферов и сбор данных в примитивы, которые будут использоваться на следующих этапах. Также на этой стадии прикрепляются значения, созданные системой для повышения эффективности шейдеров.</li>
45
<li><strong>Этап шейдеров вершин (Vertex Shader Stage)</strong> - обработка отдельных вершин шейдером для получения преобразованного атрибута.</li>
45
<li><strong>Этап шейдеров вершин (Vertex Shader Stage)</strong> - обработка отдельных вершин шейдером для получения преобразованного атрибута.</li>
46
<li><strong>Этап тесселяции (Tesselation Stage)</strong> - преобразование геометрии и формирование набора небольших объектов (треугольников, точек и линий).</li>
46
<li><strong>Этап тесселяции (Tesselation Stage)</strong> - преобразование геометрии и формирование набора небольших объектов (треугольников, точек и линий).</li>
47
<li><strong>Этап шейдера геометрии (Geometry Shader Stage)</strong> - обработка целых примитивов: треугольников, линий, точек и смежных с ними вершин.</li>
47
<li><strong>Этап шейдера геометрии (Geometry Shader Stage)</strong> - обработка целых примитивов: треугольников, линий, точек и смежных с ними вершин.</li>
48
<li><strong>Этап средства программной прорисовки (Rasterizer)</strong> - урезание примитивов, которых нет в представлении, и их подготовка для следующего этапа шейдера пикселей. Векторные данные (фигуры или примитивы) преобразуются в растровое изображение из пикселей для отображения трёхмерной графики в режиме реального времени.</li>
48
<li><strong>Этап средства программной прорисовки (Rasterizer)</strong> - урезание примитивов, которых нет в представлении, и их подготовка для следующего этапа шейдера пикселей. Векторные данные (фигуры или примитивы) преобразуются в растровое изображение из пикселей для отображения трёхмерной графики в режиме реального времени.</li>
49
<li><strong>Этап шейдера пикселей (Pixel Shader Stage)</strong> - приём интерполированных данных для примитива и генерация данных для пикселей (например, данных о цвете). На этой стадии доступны расширенные возможности, такие как попиксельное освещение и постобработка.</li>
49
<li><strong>Этап шейдера пикселей (Pixel Shader Stage)</strong> - приём интерполированных данных для примитива и генерация данных для пикселей (например, данных о цвете). На этой стадии доступны расширенные возможности, такие как попиксельное освещение и постобработка.</li>
50
<li><strong>Этап слияния и вывода (Output Merger)</strong> - выходные данные (значения пиксельного шейдера, информация о глубине и наборе элементов) объединяются с содержимым целевого объекта отрисовки, буферами глубины и набором элементов для окончательного результата.</li>
50
<li><strong>Этап слияния и вывода (Output Merger)</strong> - выходные данные (значения пиксельного шейдера, информация о глубине и наборе элементов) объединяются с содержимым целевого объекта отрисовки, буферами глубины и набором элементов для окончательного результата.</li>
51
</ul><p><strong>Примечание</strong></p>
51
</ul><p><strong>Примечание</strong></p>
52
<p>Этапы растеризации могут варьироваться в зависимости от архитектуры графического процессора. Более подробно обо всех стадиях (в контексте Direct3D) можно прочесть в <a>официальной справке</a>Microsoft.</p>
52
<p>Этапы растеризации могут варьироваться в зависимости от архитектуры графического процессора. Более подробно обо всех стадиях (в контексте Direct3D) можно прочесть в <a>официальной справке</a>Microsoft.</p>
53
<p>Теперь, когда есть представление о том, как графический и центральный процессоры обрабатывают графику, можно перейти к вопросам оптимизации.</p>
53
<p>Теперь, когда есть представление о том, как графический и центральный процессоры обрабатывают графику, можно перейти к вопросам оптимизации.</p>
54
<p>Один из важных аспектов оптимизации - использование профайлеров. Это инструменты, с помощью которых можно получить информацию об элементах, снижающих производительность в конкретных сценах. Также профайлер отображает работу низкоуровневых модулей API. В отличие от общепринятых стандартов, инструмент<a>измеряет</a>производительность в миллисекундах (ms), а не в частоте кадров в секунду.</p>
54
<p>Один из важных аспектов оптимизации - использование профайлеров. Это инструменты, с помощью которых можно получить информацию об элементах, снижающих производительность в конкретных сценах. Также профайлер отображает работу низкоуровневых модулей API. В отличие от общепринятых стандартов, инструмент<a>измеряет</a>производительность в миллисекундах (ms), а не в частоте кадров в секунду.</p>
55
<p>Профилировать графику можно непосредственно в движке (<a>Unreal Insights</a>для Unreal Engine,<a>Unity Profiler</a>для Unity) или с помощью сторонних утилит. Среди последних наиболее известны<a>RenderDoc</a>,<a>NVIDIA Nsight</a>,<a>Radeon GPU Profiler</a>и <a>Pix</a>.</p>
55
<p>Профилировать графику можно непосредственно в движке (<a>Unreal Insights</a>для Unreal Engine,<a>Unity Profiler</a>для Unity) или с помощью сторонних утилит. Среди последних наиболее известны<a>RenderDoc</a>,<a>NVIDIA Nsight</a>,<a>Radeon GPU Profiler</a>и <a>Pix</a>.</p>
56
Пример работы NVIDIA Nsight<em>Кадр:<a>Gamepons</a>/ YouTube</em><p><strong>Работая с профайлером, следует обращать внимание на несколько моментов:</strong></p>
56
Пример работы NVIDIA Nsight<em>Кадр:<a>Gamepons</a>/ YouTube</em><p><strong>Работая с профайлером, следует обращать внимание на несколько моментов:</strong></p>
57
<ul><li>Профайлер необходимо запускать на целевой платформе - не стоит оптимизировать мобильную игру на ПК.</li>
57
<ul><li>Профайлер необходимо запускать на целевой платформе - не стоит оптимизировать мобильную игру на ПК.</li>
58
<li>Профилируйте готовый билд, а не проект: редакторы игровых движков используют очень много ресурсов.</li>
58
<li>Профилируйте готовый билд, а не проект: редакторы игровых движков используют очень много ресурсов.</li>
59
<li>Старайтесь профилировать игру в разных условиях, ведь тактовая частота CPU и GPU зависит от нагрева и уровня заряда устройства. В этом могут помочь утилиты для оверклокинга - например, GPU Boost от NVIDIA или PowerTune от AMD.</li>
59
<li>Старайтесь профилировать игру в разных условиях, ведь тактовая частота CPU и GPU зависит от нагрева и уровня заряда устройства. В этом могут помочь утилиты для оверклокинга - например, GPU Boost от NVIDIA или PowerTune от AMD.</li>
60
</ul><p>Нет смысла размещать объекты с высокой детализацией на дальнем расстоянии, так как игрок их всё равно не увидит. К тому же это приведёт к снижению производительности из-за<a>овершейдинга</a>мелких деталей. Модели с низким уровнем детализации не нуждаются в освещении - для них достаточно unlit-материалов. Для текстурирования в этом случае нужно использовать только карту альбедо в низком разрешении.</p>
60
</ul><p>Нет смысла размещать объекты с высокой детализацией на дальнем расстоянии, так как игрок их всё равно не увидит. К тому же это приведёт к снижению производительности из-за<a>овершейдинга</a>мелких деталей. Модели с низким уровнем детализации не нуждаются в освещении - для них достаточно unlit-материалов. Для текстурирования в этом случае нужно использовать только карту альбедо в низком разрешении.</p>
61
Пример меша с unlit-материалом<em>Изображение:<a>Unigine</a></em><p>Всегда<strong>подключайте MIP-мэппинг</strong>в настройках текстур. МIP-мэппинг создаёт несколько копий одной текстуры с разной детализацией. Такой подход сводит полосы от швов на моделях к минимуму и предотвращает возможные проблемы в результате сглаживания.</p>
61
Пример меша с unlit-материалом<em>Изображение:<a>Unigine</a></em><p>Всегда<strong>подключайте MIP-мэппинг</strong>в настройках текстур. МIP-мэппинг создаёт несколько копий одной текстуры с разной детализацией. Такой подход сводит полосы от швов на моделях к минимуму и предотвращает возможные проблемы в результате сглаживания.</p>
62
Подключение MIP-мэппинга в Unity<p>Старайтесь<strong>комбинировать несколько текстур в одну</strong>, подключая отдельные каналы карты к разным слотам шейдеров.</p>
62
Подключение MIP-мэппинга в Unity<p>Старайтесь<strong>комбинировать несколько текстур в одну</strong>, подключая отдельные каналы карты к разным слотам шейдеров.</p>
63
Пример установки текстур в Unreal Engine<em>Кадр:<a>Gamepons</a>/ YouTube</em><p><strong>Используйте текстурные атласы</strong>для похожих мешей. Этот подход нередко применяют в игровой индустрии, так как он уменьшает количество дроуколлов.</p>
63
Пример установки текстур в Unreal Engine<em>Кадр:<a>Gamepons</a>/ YouTube</em><p><strong>Используйте текстурные атласы</strong>для похожих мешей. Этот подход нередко применяют в игровой индустрии, так как он уменьшает количество дроуколлов.</p>
64
Размещение текстур из атласа на нескольких мешах<em>Изображение: Ivan Spalla /<a>Highend3D</a></em>Оригинальная модель и модель после применения атласа<em>Кадр:<a>Ivan Spalla</a>/ Vimeo</em>Текстурный атлас<em>Кадр:<a>Ivan Spalla</a>/ Vimeo</em><p><strong>Упреждающий рендеринг</strong><em></em>(Forward Rendering) - стандартный метод рендеринга "из коробки", который используется в большинстве движков. GPU получает данные о геометрии, проецирует её и разбивает на вершины. Затем происходит преобразование вершин в геометрию и дальнейшее её разделение на фрагменты или пиксели. Они подвергаются финальной отрисовке, после чего передаются на экран. При этом освещение в сцене вычисляется отдельно для каждой вершины и каждого фрагмента в зоне видимости с учётом количества источников света.</p>
64
Размещение текстур из атласа на нескольких мешах<em>Изображение: Ivan Spalla /<a>Highend3D</a></em>Оригинальная модель и модель после применения атласа<em>Кадр:<a>Ivan Spalla</a>/ Vimeo</em>Текстурный атлас<em>Кадр:<a>Ivan Spalla</a>/ Vimeo</em><p><strong>Упреждающий рендеринг</strong><em></em>(Forward Rendering) - стандартный метод рендеринга "из коробки", который используется в большинстве движков. GPU получает данные о геометрии, проецирует её и разбивает на вершины. Затем происходит преобразование вершин в геометрию и дальнейшее её разделение на фрагменты или пиксели. Они подвергаются финальной отрисовке, после чего передаются на экран. При этом освещение в сцене вычисляется отдельно для каждой вершины и каждого фрагмента в зоне видимости с учётом количества источников света.</p>
65
<p>При<strong>отложенном рендеринге</strong>(Deferred Rendering) сначала отрисовывается вся геометрия. Затем на полученный результат накладывают фрагментарные шейдеры с освещением, и только после этого происходит вывод картинки на экран.</p>
65
<p>При<strong>отложенном рендеринге</strong>(Deferred Rendering) сначала отрисовывается вся геометрия. Затем на полученный результат накладывают фрагментарные шейдеры с освещением, и только после этого происходит вывод картинки на экран.</p>
66
<p>Иногда под отложенным рендерингом подразумевают отложенное освещение (Deferred Shading / Lighting) - модификацию отложенного рендеринга, которая уменьшает размер G-буфера за счёт большого количества источников света в кадре.</p>
66
<p>Иногда под отложенным рендерингом подразумевают отложенное освещение (Deferred Shading / Lighting) - модификацию отложенного рендеринга, которая уменьшает размер G-буфера за счёт большого количества источников света в кадре.</p>
67
Сравнение процессов при упреждающем и отложенном рендеринге<em>Источник: Васиф Абдуллаева / Gamepons. Инфографика: Майя Мальгина для Skillbox Media</em><p>Почему важно обращать внимание на метод отрисовки при оптимизации? Допустим, в сцене 100 объектов, в каждом из них порядка 1000 вершин. В таком случае в кадре будет 100 000 полигонов, которые легко обработает видеокарта. Но когда эти полигоны попадают на стадию фрагментного шейдера, запускается процесс вычисления освещения в сцене. А так как при стандартном методе расчёты освещения ведутся по отдельности для каждого сегмента, при выводе изображения не исключены задержки.</p>
67
Сравнение процессов при упреждающем и отложенном рендеринге<em>Источник: Васиф Абдуллаева / Gamepons. Инфографика: Майя Мальгина для Skillbox Media</em><p>Почему важно обращать внимание на метод отрисовки при оптимизации? Допустим, в сцене 100 объектов, в каждом из них порядка 1000 вершин. В таком случае в кадре будет 100 000 полигонов, которые легко обработает видеокарта. Но когда эти полигоны попадают на стадию фрагментного шейдера, запускается процесс вычисления освещения в сцене. А так как при стандартном методе расчёты освещения ведутся по отдельности для каждого сегмента, при выводе изображения не исключены задержки.</p>
68
<p>В случае со сложными сценами с динамическим освещением или множеством источников света лучше обратить внимание на отложенный рендеринг, так как в этом случае освещение вычисляется для каждого пикселя всего один раз, что улучшает производительность. Например, в Unreal Engine 5 этот тип рендеринга<a>используется</a>по умолчанию. Однако у него есть свои<a>недостатки</a> - в частности, несовместимость с некоторыми платформами. Поэтому выбор метода рендеринга в пользу оптимизации зависит от задач разработчика и специфики игрового движка.</p>
68
<p>В случае со сложными сценами с динамическим освещением или множеством источников света лучше обратить внимание на отложенный рендеринг, так как в этом случае освещение вычисляется для каждого пикселя всего один раз, что улучшает производительность. Например, в Unreal Engine 5 этот тип рендеринга<a>используется</a>по умолчанию. Однако у него есть свои<a>недостатки</a> - в частности, несовместимость с некоторыми платформами. Поэтому выбор метода рендеринга в пользу оптимизации зависит от задач разработчика и специфики игрового движка.</p>
69
<p>Если в сцене много статических объектов, геометрию, которая находится вне зоны видимости, отсекают. Это можно сделать как в самом игровом движке, так и с помощью динамических систем на базе GPU.</p>
69
<p>Если в сцене много статических объектов, геометрию, которая находится вне зоны видимости, отсекают. Это можно сделать как в самом игровом движке, так и с помощью динамических систем на базе GPU.</p>
70
<p>При настройках усечения обращайте внимание на минимальный размер окклюдера. Окклюдеры - это объекты, позволяющие отсекать геометрию, которая находится за ними. Например, на скриншоте ниже выставлено значение 5. Это значит, что все объекты выше или шире 5 метров не будут отображаться позади окклюдера таких объёмов, что экономит время рендеринга. Размер окклюдера во многом зависит от геймдизайна игры.</p>
70
<p>При настройках усечения обращайте внимание на минимальный размер окклюдера. Окклюдеры - это объекты, позволяющие отсекать геометрию, которая находится за ними. Например, на скриншоте ниже выставлено значение 5. Это значит, что все объекты выше или шире 5 метров не будут отображаться позади окклюдера таких объёмов, что экономит время рендеринга. Размер окклюдера во многом зависит от геймдизайна игры.</p>
71
Настройки окклюдера в движке Unity<em>Изображение:<a>Unity</a></em><p>Если речь идёт об усечении динамических мешей, в этом случае стоит использовать <a>пул объектов</a>, то есть повторно применять сущности вместо их создания и уничтожения.</p>
71
Настройки окклюдера в движке Unity<em>Изображение:<a>Unity</a></em><p>Если речь идёт об усечении динамических мешей, в этом случае стоит использовать <a>пул объектов</a>, то есть повторно применять сущности вместо их создания и уничтожения.</p>
72
Иллюстрация, объясняющая принцип работы пула объектов. Разработчик задаёт в пул определённое количество пуль, которыми стреляет игрок. Каждый раз, когда игрок делает выстрел, пуля исчезает и возвращается в пул для повторного использования. Такой подход уменьшает нагрузку на процессор<em>Источник: Mike Geig / Twitter. Инфографика: Майя Мальгина для Skillbox Media</em><p>Игрок не сможет детально рассмотреть объекты малого размера, расположенные на дальнем расстоянии. Поэтому в движке настраивают дистанцию усечения, исходя из размеров мешей. В Unity это делают с помощью<a>кода</a>, а в Unreal Engine - с помощью инструмента<a>Cull Distance Volumes</a>.</p>
72
Иллюстрация, объясняющая принцип работы пула объектов. Разработчик задаёт в пул определённое количество пуль, которыми стреляет игрок. Каждый раз, когда игрок делает выстрел, пуля исчезает и возвращается в пул для повторного использования. Такой подход уменьшает нагрузку на процессор<em>Источник: Mike Geig / Twitter. Инфографика: Майя Мальгина для Skillbox Media</em><p>Игрок не сможет детально рассмотреть объекты малого размера, расположенные на дальнем расстоянии. Поэтому в движке настраивают дистанцию усечения, исходя из размеров мешей. В Unity это делают с помощью<a>кода</a>, а в Unreal Engine - с помощью инструмента<a>Cull Distance Volumes</a>.</p>
73
<p>Многие анимации и визуальные эффекты на основе физики нагружают процессор. Вместо этого можно воспользоваться менее ресурсоёмкими техниками. Например, при вертексной анимации, известной как<a>Vertex Animation Texture</a>, используются только текстуры и шейдеры, поэтому основная нагрузка идёт на видеокарту, а не на процессор.</p>
73
<p>Многие анимации и визуальные эффекты на основе физики нагружают процессор. Вместо этого можно воспользоваться менее ресурсоёмкими техниками. Например, при вертексной анимации, известной как<a>Vertex Animation Texture</a>, используются только текстуры и шейдеры, поэтому основная нагрузка идёт на видеокарту, а не на процессор.</p>
74
<p><a>via GIPHY</a></p>
74
<p><a>via GIPHY</a></p>
75
Демонстрация вертексной анимации<a><em>GIF</em></a><em>: лекция Васифа Абдуллаева на Gamepons / YouTube</em><p>Старайтесь избегать этапов<a>тесселяции</a>и <a>шейдера геометрии</a>, так как они занимают много времени. Если нужно подчеркнуть рельефность, можно сделать следующее:</p>
75
Демонстрация вертексной анимации<a><em>GIF</em></a><em>: лекция Васифа Абдуллаева на Gamepons / YouTube</em><p>Старайтесь избегать этапов<a>тесселяции</a>и <a>шейдера геометрии</a>, так как они занимают много времени. Если нужно подчеркнуть рельефность, можно сделать следующее:</p>
76
<ul><li>Рассмотрите текстурирование с использованием<a>карты параллакса</a>в качестве альтернативы.</li>
76
<ul><li>Рассмотрите текстурирование с использованием<a>карты параллакса</a>в качестве альтернативы.</li>
77
<li>Уменьшайте тесселяцию в зависимости от расстояния камеры.</li>
77
<li>Уменьшайте тесселяцию в зависимости от расстояния камеры.</li>
78
</ul><p>Также следует воздержаться от большого количества конструкций ветвления (<strong>if</strong>)<strong></strong>в коде шейдеров. GPU лучше воспринимает параллельный код.</p>
78
</ul><p>Также следует воздержаться от большого количества конструкций ветвления (<strong>if</strong>)<strong></strong>в коде шейдеров. GPU лучше воспринимает параллельный код.</p>
79
<p>Кроме того, старайтесь сократить количество<a>входных параметров шейдера</a>. Оставьте только те, что можно изменить во время выполнения. Используйте минимальную<a>точность шейдеров</a>, особенно при разработке мобильных проектов. И обращайте внимание на <a>занятость шейдеров</a>.</p>
79
<p>Кроме того, старайтесь сократить количество<a>входных параметров шейдера</a>. Оставьте только те, что можно изменить во время выполнения. Используйте минимальную<a>точность шейдеров</a>, особенно при разработке мобильных проектов. И обращайте внимание на <a>занятость шейдеров</a>.</p>
80
<p>И ещё несколько общих рекомендаций, которые помогут улучшить оптимизацию игры.</p>
80
<p>И ещё несколько общих рекомендаций, которые помогут улучшить оптимизацию игры.</p>
81
<ul><li>Проверяйте и профилируйте эффекты постпроцессинга. Если они сильно влияют на задержку - рассмотрите другие варианты.</li>
81
<ul><li>Проверяйте и профилируйте эффекты постпроцессинга. Если они сильно влияют на задержку - рассмотрите другие варианты.</li>
82
<li>Отслеживайте производительность при наличии теней и используйте<a>каскадные теневые карты</a>.</li>
82
<li>Отслеживайте производительность при наличии теней и используйте<a>каскадные теневые карты</a>.</li>
83
<li>Помните, что запекание освещения менее ресурсоёмкое, чем освещение в реальном времени.</li>
83
<li>Помните, что запекание освещения менее ресурсоёмкое, чем освещение в реальном времени.</li>
84
<li>Существует несколько способов создания определённых спецэффектов - выберите самый эффективный метод, подходящий вашему проекту.</li>
84
<li>Существует несколько способов создания определённых спецэффектов - выберите самый эффективный метод, подходящий вашему проекту.</li>
85
<li>Не забывайте, что использование системы частиц может негативно повлиять на производительность.</li>
85
<li>Не забывайте, что использование системы частиц может негативно повлиять на производительность.</li>
86
<li>Если есть возможность, измените значение счётчика<a>цепочки буферов</a>и проверьте результат.</li>
86
<li>Если есть возможность, измените значение счётчика<a>цепочки буферов</a>и проверьте результат.</li>
87
<li>Используйте динамическое разрешение.</li>
87
<li>Используйте динамическое разрешение.</li>
88
</ul><p>Помните, что оптимизация графики в играх зависит от общего визуального стиля проекта, жанра, целевой платформы и специфики игрового движка. Рекомендации, приведённые в этом материале, а также углублённое изучение и понимание внутренних процессов рендеринга помогут улучшить производительность вашего проекта.</p>
88
</ul><p>Помните, что оптимизация графики в играх зависит от общего визуального стиля проекта, жанра, целевой платформы и специфики игрового движка. Рекомендации, приведённые в этом материале, а также углублённое изучение и понимание внутренних процессов рендеринга помогут улучшить производительность вашего проекта.</p>
89
<a>Научитесь: Профессия Геймдизайнер с нуля до PRO Узнать больше</a>
89
<a>Научитесь: Профессия Геймдизайнер с нуля до PRO Узнать больше</a>