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 зависит от количества прозрачных элементов в кадре, уровня их наслоения и заключается в длительности их изображения на экране. Вместе с увеличением числа прозрачных предметов увеличивается время, необходимое на их отрисовку. Рендер рисует цвет каждого пикселя, поэтому увеличенное количество треугольников, наоборот, сократит процесс.
Если в одной плоскости оказывается больше одного триса, образуется артефакт Z-Fight. Рендер может нарисовать пиксели в некорректном порядке. Помимо внешнего дефекта, время отрисовки увеличится, так как произойдет «конфликт» между пикселями из-за очередности изображения.
Таким образом, в отрисовке кадра важен каждый этап, и оптимизация – отдельный сложный процесс. Число полигонов может варьироваться в зависимости от устройства и конкретного проекта, поэтому нельзя определить оптимальное их количество. Для расчета количества полигонов нужно учитывать и визуал кадра, и временные ограничения.
Главная задача – создание красивой визуальной составляющей, а не «преждевременная оптимизация».