Оптимизация через уменьшение 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) можно указать дефолтное значение для определенного индекса.