Найти тему
TheDolaxom.dev

Как делать игры? Оптимизация

Оглавление

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

Рендер

Сначала поговорим о каллинге, ведь на его основе мы и можем играть в игры в хорошем fps. Многие о нём не знают только из-за того, что он уже по стандарту включен в движках и не требует особой настройки, но рассказать о нём всё равно необходимо.

Что такое Culling вообще? Я думаю что вам всё сможет объяснить эта гифка:

Рендер в Horizon zero dawn
Рендер в Horizon zero dawn

Как, я надеюсь вы поняли, движок не рендерит всё то, что вы не видите (всё то, что находится за пределами вашего "зрения"), т.к в этом нет никакой необходимости. Зачем тратить ресурсы на прорисовку того, что находится за спиной игрока и он никак это увидит? - правильно, ни к чему это не надо.
Подобный меток каллинга называется
frustum culling, но помимо него существует ещё один, который также по дефолту уже работает в ue4 сам по себе:

Occlusion Culling - благодаря нему вы уже не увидите всё то, что находится за другим объектом. Как пример, игрок стоит в доме и смотрит в стену. Есть ли какой-то смысл рендерить всё то, что находится ща этой стеной? Опять же, смысла в этом нет, поэтому оно и не прорисовывается.

Если вы хотите посмотреть на Occlusion culling в действии, то для этого есть команда r.VisualizeOccludedPrimitives 1. После её ввода в ue4 вы начнёте видеть контуры скрытых объектов объектов. Кстати, если вам для чего-то надо, чтобы объект прорисовывался раньше, то для этого нужно изменить этот контур. Для этого надо менять значение объекта Bounds Scale.

Level Streaming - очередная возможность задать появление объектов. Например, вы хотите кастомно назначить где и когда должна появляться посуда в ресторане. Ведь движок её будет прорисовывать, скорее всего, тк на посуду будет смотреть камера через какое-нибудь окно, из-за чего culling здесь уже не поможет. Тогда вы можете поставить Level Streaming, область, в которой будут прорисовываться определённые меши (модельки). В примере с рестораном и посудой, область стриминга уровня можно поставить на территории самого ресторана и возле окон, а значит только на этой территории будут появляться выбранные нами модельки, в нашем случае посуда.

Distance Culling - очередной вид каллинга, который уже необходимо настраивать вручную. Он необходим для того, чтобы объекты пропадали на определённом расстоянии. Как пример, смысла прорисовывать мелкие камни в траве на расстоянии пару десятков метров уже нет, а значит мы можем просто убрать их рендер через значение desired max draw distance в объекте (указав там то самое расстояние).

Материалы (текстуры):

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

  • изучите вопрос текстурных атласов. Необязательно для каждого объекта делать отдельную текстуру. Допустим, у вас есть деревянная лестница, деревянный указатель и тп. Можно просто взять один единый материал для дерева, отредактировать его в некоторых местах (например, в углу добавить текст для названия региона на указателе), после чего использовать эту одну единую текстуру. Ешё один наглядный пример - еда. Недавно я закончил работать над таверной в игре, и как можно догадаться, там есть большое количество еды, кружек, мисок. Я просто создал для этого один единственный материал, где собрал всё вместе в единое целое. Благодаря этому, можно сэкономить большое количество занимаемой видеопамяти, что очень важно при создании игры с большим открытом миром, да и любой другой игры.
  • Не нужно использовать много текстур высокого качества. Если вы делаете атлас, то там уже можно сделать 2к текстуру (например). Для больших моделей, по типу домов, можно использовать 4к текстуры. Но, если вы всё таки выделяете один материал для одного объекта (я говорю про обычные маленькие пропсы, например корзина с едой), то здесь нужно использовать максимально маленькое разрешение текстуры, хотя бы 1024x1024. Хотя многие не стесняются использовать и 512x512.
  • Делайте текстурные "лоды" - изучите вопрос Mipmaps. Эта система нужна для уменьшения качества (разрешения) текстур по мере того, как вы от них удаляетесь. Да, эта функция уже встроена по дефолту в ue4, но по моему мнению, лучше всё это настраивать вручную 👀

LOD-ы:

Что такое Лоды у объектов? Это система понижения количества трисов (полигонов) у модельки по мере отдаления от неё. Когда вы смотрите на дом впритык, то вы, допустим, видите там 10 тысяч трисов. Но вот вы отошли от дома на 100 метров, и от 10 тысяч осталось только 3 тысячи. И игрок этого никак не заметит, ибо он уже достаточно далеко, чтобы заметить изменения во всяких незначительных деталях. Подобных лодов может быть несколько штук. Например, нулевой лод (самый первый) имеет все те 10 тысяч трисов, ведь вы стоите прямо перед ним. Следующий лод сработает в 10 метрах, и останется только 8 тысяч трисов. В 50 метрах останется 5 тысяч, в 100 метрах 3 тысячи и тд. Все значения вы можете регулировать сами. Главное особо не переборщить с этим, ведь с увеличением количества лодов растёт и вес игры.

twitter Автор LMHPOLY @lmhpoly
twitter Автор LMHPOLY @lmhpoly

Как следить за оптимизацией?

Основной инструмент для этого - UE4 CPU Profiler. Благодаря нему вы можете посмотреть куда и сколько потратилось ресурсов вашей игры. Он уже встроен в ue4.

Ещё один встроенный инструмент - GPU Visualizer. Для его отрктия, вам необходимо написать ProfileGPU в консоли.

-3

Что же, а на этом всё :3
Я затронул самые основные понятия, которые могут вам помочь в разработке и оптимизации ваших игр ❤️

Если у вас появятся какие-либо вопросы, вы всегда сможете найти меня тут. Или напишите свой вопрос в комментариях, я также с удовольствием на него отвечу :3