11/10/2021

Оптимизация через уменьшение DrawCalls в материалах

Оптимизация через уменьшение DrawCalls в материалах

Есть множество способов снизить количество DrawCalls в Unreal Engine. В данной статье Владимир Ханин рассказывает про один из таких способов — “Custom primitive data”.

При использовании CPD (Custom primitive data) в материале используется хранение индекса, к которому есть доступ из кода или принтов. Функция очень похожа с изменением скалярных и векторных параметров динамических материалов. Главное отличие —  CPD хранит информацию в самом примитиве, а не в инстансе материала, количество DrawCalls становится в разы меньше, тем самым оптимизируя проект.

Подробнее — в официальной документации.

Итак, на пустой сцене у нас — 7 DrawCalls:

Рассмотрим на примерах влияние CPD и динамических материалов на производительность.

Классическое применение параметров материалов

Создадим материал векторным параметром, отвечающим за цвет:

Создадим простой актор, с одним статик мешем и добавим принт, меняющий цвет на констракте. Имя параметра в ноде должно быть таким же, как название ноды в материале:

Разместив на уровне 30 кубиков, мы увидим, что количество DrawCalls увеличилось до 41:

Создание параметра при помощи CPD

Создадим точно такой же материал, но с установленной галочкой “Use Custom primitive Data”:

В BP акторе добавим ноду “Set Custom Primitive Data Vector4”. Важно заметить, что DataIndex в ноде должен быть установлен точно такой же, как и в Primitive Data Index в материале. Отвечающий за прозрачность ValueW ставим в единицу.

Размещаем точно так же 30 кубиков на сцене. Количество DrawCalls уменьшилось почти в 3 раза – с 41 до 12.

Можно сделать вывод, что CPD почти в половину срезает количество DrawCalls, по сравнению с динамическими изменениями материалов, тем самым повышая производительность приложения.

Важно — "Custom primitive data" уменьшит DC только, если включен автоматический инстансинг. В случае ручного инстансинга и если нужно разнообразить меши, можно использовать "Per Instance Custom Data".

Один из ключевых недостатков этого способа — нет возможности изменять данный параметр в инстансе материала. И по дефолту такой параметр будет равняться 0.

Второй минус вытекает из первого. Изменять параметр нужно в Runtime, так как при изменении на Construction Script параметр при запущенном приложении не изменится, и мы получим черную модель (если меняем материал). Хотя для Scalar Primitive data parameter в настройке модели (Rendering) можно указать дефолтное значение для определенного индекса.

Недавние статьи

WN Conference Abu Dhabi’24: откройте бизнес-возможности в ОАЭ

07/02/2024
Уже 15-16 февраля более 800 представителей игровой индустрии встретятся для двух дней активного нетворкинга и обучения.

WN Conference Belgrade’23 уже скоро!

25/11/2023
7-8 декабря более 800 представителей местной и международной индустрии встретятся для двух дней активного нетворкинга.

7-8 июня WN Conference возвращается в Турцию

23/05/2023
Присоединяйтесь оффлайн или онлайн к бизнес-конференции для представителей игровой индустрии WN Istanbul’23.