Как разработчику повысить производительность игр / Skillbox Media
Выпуск неоптимизированной игры — один из смертных грехов разработчиков. Узнайте, как снизить требования к железу.

Содержание:

Кто вы в мире геймдева? Узнайте на бесплатном курсе ➞ Вы на практике попробуете 3 профессии: геймдизайнера, 2D-художника и разработчика на Unity. Создадите свою первую игру в стиле Mario. Подробности — по клику.
Узнать большеМы живём в эпоху невероятно мощных компьютеров. У нас есть видеокарты, которые позволяют трассировать лучи в реальном времени, хотя многие считали, что до этой технологии нам как до Луны.
Из-за этого у многих разработчиков складывается мнение, что оптимизация — дело десятое. Зачем стараться, если у игрока достаточно мощный комп и он даже не заметит разницы?
Однако плохая оптимизация может привести к тому, что на слабых компьютерах, а может, даже и на мощных игры будут тормозить и вылетать. В этой статье я расскажу об основных способах повышения производительности.
Удалить лишние объекты
В статье про гонку на Unity я использовал генерируемую дорогу, чтобы сделать игру бесконечной. Для этого перед игроком добавлялись новые дорожные блоки, а когда игрок проезжал определённое расстояние от блока, тот удалялся.
Если бы этого не происходило, то через несколько минут (зависит от объёма оперативной памяти) игра начала бы сильно тормозить, а потом и вовсе бы вылетела.

Даже если локация не генерируется, всё равно найдётся что удалить:
- осколки;
- гильзы;
- трупы;
- щепки;
- кровь и тому подобное.
Тут важно ориентироваться на особенности вашей игры. В Counter-Strike гильзы можно смело удалять. Но в игре про детективов или снайперов они могут быть важной частью геймплея.
Проблема слишком большого количества объектов будет существовать до тех пор, пока мы не научимся производить оперативную память с бесконечным объёмом. Так что оптимизация нам нужна будет ещё очень и очень долго.
Иногда эту проблему невозможно решить. Например, если в вашей игре предусмотрена механика перемотки времени, тогда вы, наоборот, должны хранить всю информацию за то время, на которое игрок может переместиться в прошлое.
Тут можно либо сделать количество объектов минимальным, либо использовать «грязные» трюки, как это сделали разработчики игры Super Time Force.
Отключить отображение объектов
Некоторые объекты, например статичные части игрового мира, нельзя удалять. Но вместо этого их можно отключать. Чаще всего это используется в играх с большим открытым миром:

Можно отключать только рендеринг объекта, а можно и весь объект. В этом случае снизится нагрузка не только на графическую карту, но и на центральный процессор, потому что игра не будет проверять коллизии и физику.
Но вот с физикой всё же нужно быть осторожнее. Если игрок отвернётся от объекта, пока тот падал, а вы его (объект) отключите, то получится странный эффект. Объект никогда не упадёт, пока игрок снова на него не посмотрит.
Впрочем, это можно использовать как особенность игры. Хороший пример: в сериале «Доктор Кто» есть существа, называемые плачущими ангелами. На вид это обычные статуи, но, когда на них никто не смотрит, они могут перемещаться.

Отсылка к этим ангелам есть в игре The Witcher 3:
Оптимизировать ассеты
Всегда старайтесь использовать ассеты, которые меньше весят: то есть low-poly (англ. низкополигональные) объекты, сжатые текстуры и так далее. Как правило, почти любой ассет можно оптимизировать так, что он по-прежнему будет хорошо выглядеть. И если с текстурами вы можете сделать это сами, то оптимизировать объекты может только опытный 3D-художник.
Вот пример неплохой низкополигональной (по современным меркам) модели:

Если добавить хорошую текстуру, то такая модель подойдёт в качестве декорации для проекта с хорошей графикой:

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

Экономичнее работать со светом, тенями и отражениями
Рассчитывание и отрисовка света, теней и отражений потребляют очень много ресурсов. В то же время эти эффекты делают визуал выразительнее. Тут можно посоветовать делать как можно меньше источников света и отражающих поверхностей.
Что касается теней, то тут лучше всего поможет ограничение числа объектов с динамичными тенями.
Распределять нагрузку
Современные процессоры оснащены как минимум двумя ядрами. Однако будут ли эти дополнительные ядра использоваться, зависит от разработчика. То есть если у вас в игре есть какие-то сложные вычисления, которые не зависят от движка, то старайтесь выполнять их параллельно.
Как это сделать, зависит от выбранной технологии.
Помните о кешировании
Если в игре вы неоднократно используете какое-то значение, которое рассчитывается скриптами, то его лучше сохранить, а не использовать несколько раз.

Так же и с графикой: если вы с помощью кода отрисовываете спрайт, который будете использовать несколько раз, то его нужно сохранить в файл или в память, чтобы не тратить ресурсы на отрисовку каждый раз.
Кто вы в мире геймдева? Мини-курс для тех, кто хочет делать игры
На бесплатном мини-курсе вы попробуете себя в роли геймдизайнера, 2D-художника, разработчика игр на Unity и выберете профессию, которая подходит именно вам.
Узнать подробнее