Время или полигоны?

21.02.2020

Преподаватель и левел-дизайнер Денис Куандыков объясняет, как устроена оптимизация количества полигонов в геймдеве. На курсах для разработчиков игр и 3D-художников (эти — исключение) не всегда уделяется достаточное внимание частоте кадров и оптимизации. Нередко начинающие 3D-художники допускают стандартные ошибки.

Описание проблемы

В работе с геометрией можно зря потратить время на «оптимизацию» путем уменьшения количества полигонов, в этом нет никакого смысла. Нельзя «на глаз» определить сложность кадра, 3D-художник не может указать оптимальное число трисов (треугольных полигонов), если не знает техническую составляющую игры. Иногда она бывает неточной, например, если разработчик пишет свою или стандартизированную игру. Отрисовку можно проанализировать с помощью следующих программ:

Отрисовка кадра

Стоимость отрисовки рассчитывается относительно времени кадра – времени в миллисекундах, необходимое для отрисовки одного кадра. В программах есть специальные функции, позволяющие определить эту величину, например, команда Draw Call. С ее помощью вычисляется сложность отрисовки: чем чаще приходится ее вызывать, тем сложнее и дольше выполняется один кадр, в результате уменьшается FPS (frames per seconds – кадры в секунду).

Количество запусков Draw Call может сильно отличаться в зависимости от конкретного проекта, работы рендер-паплайна и других факторов. Рендер-паплайн – индивидуальная система, поэтому и оценить оптимизацию бывает сложно. Главный критерий оценки отрисовки – стоимость кадра, в основе которой лежит время. Для оптимизации не так важно число полигонов, как потенциально возможное количество вызовов отрисовки.

Вызовы отрисовки и батчинг

Можно предположить, что программа вызывается такое количество раз, сколько объектов находится в кадре. Фактически вызов отрисовки (батч) происходит реже благодаря батчингу – все однотипные предметы с одинаковым шейдером и материалом соединяются в один и отрисовываются одновременно.

Батчинг подразделяется на два основных вида:

Рендеринг

Уровни детализации

Level of Detail (LOD – уровень детализации) – техника, с помощью которой можно поместить в кадре большое число деталей и сократить время на отрисовку. LOD разбивает объекты на разные батчи, составляя LOD-меш, но это нормально и может поспособствовать ускорению обработки. Лучше не создавать много уровней детализации, так как они занимают немаленький объем памяти. Как правило, используется четыре уровня, при этом LOD-0 – оригинальная модель, а LOD-4 может стать 2D копией. Для конкретных сцен может понадобиться даже большая детализация, чем представлена в оригинальной модели. Используемый в игре вариант полностью зависит от роли этого предмета – чем детальнее его можно рассмотреть, тем выше LOD.

Alpha overdraw

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

Если в одной плоскости оказывается больше одного триса, образуется артефакт Z-Fight. Рендер может нарисовать пиксели в некорректном порядке. Помимо внешнего дефекта, время отрисовки увеличится, так как произойдет «конфликт» между пикселями из-за очередности изображения.

Итог

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

Главная задача – создание красивой визуальной составляющей, а не «преждевременная оптимизация».

RENDER.RU