ая обработка объединяет объекты в группы, чтобы визуализировать их при помощи одного вызова. Движок выполняет это двумя способами:
• Динамическое пакетирование
Движок будет рисовать несколько объектов за один вызов отрисовки, если в объектах используются один и тот же материал и текстуры. В ваших интересах ограничить количество используемых в сцене материалов. Учитывайте это с самого начала разработки.
• Статическое пакетирование
Движок будет объединять объекты в единую сетку, если они остаются неподвижными во время игры. Чтобы статическая обработка работала, нужно пометить неподвижные объекты как статические. Такая пакетная обработка сокращает время, необходимое для рендеринга кадра, но использует большой объем памяти.
2. Уменьшить количество освещения и теней в реальном времени
Освещение в реальном времени дает большую нагрузку на графический процессор, а в некоторых случаях и на центральный. Меньшее количество источников света улучшит производительность игры. Если в сцене должно быть много источников света в реальном времени, придумайте способ, как отключить те, которые оказываются за полем зрения камеры.
3. Запечь карты освещения
Замена освещения в реальном времени запеченными картами может сэкономить ресурсы графического и центрального процессоров. Однако из-за того, что карты освещения – это, по сути, текстуры, их придется хранить в памяти – за производительность придется заплатить. Тем не менее, если игра позволяет, запеченное освещение почти всегда предпочтительнее. Если же в игре много движущихся объектов, запеченное освещение ей не подойдет. Используйте его как можно чаще, если это возможно.
4. Сократить объем кода на кадр
Начинающие разработчики, как правило, забывают, что код, который выполняется при каждом кадре, требует вычислительной мощности. Иногда это оправданно: например, готовность программы принять входящие данные. Но большинство задач не следует выполнять в каждом отдельном кадре. Подумайте, как предотвратить сложные вычисления при каждом кадре. Могут решить проблему такие инструменты программирования, как события и сопрограммы. Обязательно изучите их.
5. Использовать frustum culling
Frustum culling[22] – геометрический термин, часто применяемый в программировании видеоигр. Это процесс отключения объектов, которые не видны в пределах обзора (отсечение по пирамиде видимости), таким образом, чтобы игра отрисовывала только объекты, которые находятся в поле зрения камеры. Игры с открытым миром используют его постоянно. Если игра трехмерная и допускает свободное движение камеры, использование отбраковки усеченной пирамиды поможет увеличить частоту кадров.
6. Использовать уровни детализации (LOD)
Уровни детализации часто используются в 3D-играх, где можно смотреть на объекты с разных расстояний. Игровые движки включают в себя эту функцию по умолчанию. Она позволяет переключаться между сетками уровней детализации в зависимости от расстояния между объектом и камерой. Все, что нужно сделать, – создать сетки различной сложности. Существуют инструменты, автоматически генерирующие LOD для сеток. Обычно они работают хорошо, хотя создание уровней детализации вручную даст лучшие результаты.
7. Оптимизировать рейкастинг
Рейкастинг (raycasting) – самый простой из множества алгоритмов рендеринга компьютерной графики, использующих трассировку лучей. Его можно понимать как «невидимый лазер»: когда его луч направлен в определенную сторону, он сообщает, есть ли что-то на его пути. Когда он сталкивается с неким объектом, вы получаете информацию об объекте. Луч может сказать, как далеко находится объект, под каким углом расположен, как называется и многое другое. Рейкастинг используется, чтобы проверить, стоит ли персонаж на твердой поверхности, попадает ли пуля во врага, находится ли игрок рядом с препятствием и т. д. Трассировка лучей – полезная, но требовательная к производительности операция. Если ее произвести неправильно, она значительно снизит производительность игры. Несколько советов, как можно оптимизировать рейкастинг:
• Избегайте рейкастинга в каждом кадре
Если нужно проверить, находится ли персонаж на твердой поверхности, можно применять рейкастинг в каждом кадре, но технически более грамотно делать это в каждом втором или каждом третьем кадре. Более того, попробуйте использовать рейкастинг в обновлении физических параметров, которое работает независимо от частоты кадров. Экран способен отображать до 60 кадров в секунду, в то время как игра может работать со скоростью 600 кадров в секунду. Запуская рейкаст в каждом фрейме, вы тратите ресурсы, которые могут пойти на более важные задачи.
• Ограничьте длину рейкастов
Не делайте рейкасты длиннее, чем нужно. Чем они длиннее, тем больше требуется обработки. Например, чтобы узнать, стоит ли персонаж на твердой поверхности, будет достаточно крошечного луча от ног персонажа к земле.
• Установите маску слоя для рейкаста
Подумайте, какие объекты можно исключить из зоны действия луча. Возвращаясь к примеру с проверкой положения персонажа: сделайте так, чтобы рейкаст игнорировал все объекты, которые не находятся на слое «земля». Чем меньше количество объектов, с которыми взаимодействует рейкаст, тем меньше нагрузка на общую производительность.
8. Используйте пул объектов
Объединение (пул) объектов означает повторное использование предварительно загруженных объектов, вместо того чтобы создавать или уничтожать их всякий раз, как это потребуется по ходу игры. Создание и уничтожение игровых объектов в реальном времени снижает производительность; пул объектов – популярное решение этой проблемы.
Например, если персонаж – лучник, вы можете предварительно загрузить в память десять объектов-стрел до начала игры. Каждый раз, когда игрок будет выпускать стрелу, она будет браться из пула предварительно загруженных объектов. Когда в пуле закончатся стрелы, то вместо создания нового объекта первая стрела вернется в пул и будет повторно использована во время следующего выстрела. Таким образом, в пуле никогда не закончатся стрелы, цикл будет продолжаться бесконечно.
В заключение скажу, что оптимизация игры – очень важная тема, изучить которую вы должны как можно раньше. Хотя многие шаги, касающиеся оптимизации, можно предпринять прямо перед релизом, некоторые должны стать частью рабочего процесса сразу, как только вы начнете разработку. Например, сделать так, чтобы игровые объекты использовали одни и те же материалы, обеспечить динамическую пакетную обработку – это не то, за что стоит браться в последний момент. Имейте в виду, что проблемы с производительностью, незаметные на вашем компьютере, могут проявиться на более медленных машинах.
Последние 10%
Когда игра будет выглядеть законченной и стабильной, не спешите ее выпускать. Возможно, вам захочется побыстрее поделиться своим творением – не торопитесь. Потратьте время, чтобы максимально отшлифовать игру. Небольшие улучшения важны как для игроков, так и для прессы. Слишком много игр выходят в состоянии «минимально жизнеспособного продукта». Дополнительно поработайте над балансом и покажите, что вам не все равно, что вы действительно вкладываете душу в свое детище – это ваш шанс выделиться. Несколько идей насчет того, что можно улучшить:
1. Управление
Неотзывчивое управление может сильно раздражать. Вы наверняка привыкли к тому, как игра реагирует на ввод данных, но подумайте о том, чтобы сделать элементы управления четко прописанными и отзывчивыми. Если в игре используется клавиатура, попробуйте реализовать переназначение клавиш.
2. Анимация
Подумайте об ускорении некоторых анимаций. Быстрые анимации обычно улучшают общее впечатление от игры. Это относится не ко всем жанрам, но если ваша игра каким-то образом зависит от времени, в ваших интересах постараться сократить секунды, необходимые игроку для выполнения действий. Например, полезно сделать анимацию атаки практически мгновенной. Нажатая кнопка должна привести к немедленной реакции персонажа. Мгновенная отзывчивость всегда комфортнее.
3. Камера
Независимо от жанра игры, поведение камеры играет роль в том, чтобы игрок ощущал себя определенным образом. Эффект дрожащей камеры (когда уместен) может сделать игру более захватывающей. Капли воды во время дождя, эффект пыли в момент столкновений, глубина резкости, размытие в движении, хроматическая аберрация, цветовые вспышки, цветокоррекция и другие приемы постобработки сделают поведение камеры более реалистичным.
3. Меню паузы
Вы можете думать, что отлично настроили свою игру и никто не захочет ничего менять, однако игроки ожидают, что в меню паузы будет доступ к различным настройкам. Честно предупреждаю: создание меню паузы с множеством разнообразных настроек занимает много времени, но стоит того. Рассмотрите следующие настройки:
• Графика. Сюда входят такие вещи, как качество текстур, тип сглаживания, разрешение и вертикальная синхронизация.
• Аудио. Общий уровень громкости и отдельные регуляторы для звуковых эффектов, музыки и диалогов.
• Элементы управления. Помимо переназначения клавиш, рассмотрите возможность добавить ползунок чувствительности мыши, а также инвертировать оси X и Y.
• Геймплей. Если это применимо, добавьте уровни сложности и различные настройки доступности (см. ранее в этой главе).
5. Звук
Саунд-дизайн – важная часть процесса разработки. Когда он сделан хорошо, на это редко обращают внимание. Однако если звуковые эффекты непостоянны, плохо сведены или слишком часто повторяются, на это внимание обратят обязательно. Это испортит погружение и будет раздражать. Неважно, занимаетесь вы звуковым дизайном самостоятельно или делегируете это профессионалу, – самое время пересмотреть микс и переработать затухание, реверберацию и прочие параметры.