Оптимизация: как создавать игры, которые не тормозят
Выпуск неоптимизированной игры — один из смертных грехов разработчиков. Узнайте, как снизить требования к железу.
vlada_maestro / shutterstock
Мы живём в эпоху невероятно мощных компьютеров. У нас есть видеокарты, которые позволяют трассировать лучи в реальном времени, хотя многие считали, что до этой технологии нам как до Луны.
Из-за этого у многих разработчиков складывается мнение, что оптимизация — дело десятое. Зачем стараться, если у игрока достаточно мощный комп и он даже не заметит разницы?
Однако плохая оптимизация может привести к тому, что на слабых компьютерах, а может, даже и на мощных игры будут тормозить и вылетать. В этой статье я расскажу об основных способах повышения производительности.
Удалить лишние объекты
В статье про гонку на Unity я использовал генерируемую дорогу, чтобы сделать игру бесконечной. Для этого перед игроком добавлялись новые дорожные блоки, а когда игрок проезжал определённое расстояние от блока, тот удалялся.
Если бы этого не происходило, то через несколько минут (зависит от объёма оперативной памяти) игра начала бы сильно тормозить, а потом и вовсе бы вылетела.
Даже если локация не генерируется, всё равно найдётся что удалить:
- осколки;
- гильзы;
- трупы;
- щепки;
- кровь и тому подобное.
Тут важно ориентироваться на особенности вашей игры. В Counter-Strike гильзы можно смело удалять. Но в игре про детективов или снайперов они могут быть важной частью геймплея.
Проблема слишком большого количества объектов будет существовать до тех пор, пока мы не научимся производить оперативную память с бесконечным объёмом. Так что оптимизация нам нужна будет ещё очень и очень долго.
Иногда эту проблему невозможно решить. Например, если в вашей игре предусмотрена механика перемотки времени, тогда вы, наоборот, должны хранить всю информацию за то время, на которое игрок может переместиться в прошлое.
Тут можно либо сделать количество объектов минимальным, либо использовать «грязные» трюки, как это сделали разработчики игры Super Time Force.
Отключить отображение объектов
Некоторые объекты, например статичные части игрового мира, нельзя удалять. Но вместо этого их можно отключать. Чаще всего это используется в играх с большим открытым миром:
Можно отключать только рендеринг объекта, а можно и весь объект. В этом случае снизится нагрузка не только на графическую карту, но и на центральный процессор, потому что игра не будет проверять коллизии и физику.
Но вот с физикой всё же нужно быть осторожнее. Если игрок отвернётся от объекта, пока тот падал, а вы его (объект) отключите, то получится странный эффект. Объект никогда не упадёт, пока игрок снова на него не посмотрит.
Впрочем, это можно использовать как особенность игры. Хороший пример: в сериале «Доктор Кто» есть существа, называемые плачущими ангелами. На вид это обычные статуи, но, когда на них никто не смотрит, они могут перемещаться.
Отсылка к этим ангелам есть в игре The Witcher 3:
Снизить детализацию отдалённых объектов
Тут можно подойти по-разному:
- снижать разрешение текстур;
- снижать количество полигонов у объектов;
- отключать шейдеры и так далее.
В более старых играх можно заметить, что объекты и вовсе исчезают, а вместо них появляются текстуры.
Оптимизировать ассеты
Всегда старайтесь использовать ассеты, которые меньше весят: то есть low-poly (англ. низкополигональные) объекты, сжатые текстуры и так далее. Как правило, почти любой ассет можно оптимизировать так, что он по-прежнему будет хорошо выглядеть. И если с текстурами вы можете сделать это сами, то оптимизировать объекты может только опытный 3D-художник.
Вот пример неплохой низкополигональной (по современным меркам) модели:
Если добавить хорошую текстуру, то такая модель подойдёт в качестве декорации для проекта с хорошей графикой:
Расставить приоритеты качества
Кстати о декорациях: не все игровые объекты должны быть высокого качества. Например, главный герой должен быть как можно более проработанным. Но, скажем, цветы, траву и камни можно сделать низкого разрешения.
Экономичнее работать со светом, тенями и отражениями
Рассчитывание и отрисовка света, теней и отражений потребляют очень много ресурсов. В то же время эти эффекты делают визуал выразительнее. Тут можно посоветовать делать как можно меньше источников света и отражающих поверхностей.
Что касается теней, то тут лучше всего поможет ограничение числа объектов с динамичными тенями.
Распределять нагрузку
Современные процессоры оснащены как минимум двумя ядрами. Однако будут ли эти дополнительные ядра использоваться, зависит от разработчика. То есть если у вас в игре есть какие-то сложные вычисления, которые не зависят от движка, то старайтесь выполнять их параллельно.
Как это сделать, зависит от выбранной технологии.
Помните о кешировании
Если в игре вы неоднократно используете какое-то значение, которое рассчитывается скриптами, то его лучше сохранить, а не использовать несколько раз.
Так же и с графикой: если вы с помощью кода отрисовываете спрайт, который будете использовать несколько раз, то его нужно сохранить в файл или в память, чтобы не тратить ресурсы на отрисовку каждый раз.
Самое главное
При оптимизации важнее всего — понимать, что нельзя делать это бесконечно. Как бы вы ни старались, вы не сможете портировать Death Stranding на современные мобильные устройства без потери качества.
Поэтому ещё во время разработки нужно определиться, для каких устройств и для какой аудитории будет ваша игра. Возможно, простая графика и низкие требования к железу станут вашими фишками?
Также очень важны навыки разработчика: профессионал пишет более производительный код и лучше работает с движком. Если вы хотите хорошо освоиться с движком Unity, то вам стоит пройти курс, на котором вы не только овладеете всеми необходимыми для разработчика навыками, но и создадите первые проекты.