Объединение (Batching)
Объединение (Batching) - это процесс объединения нескольких экземпляров сетки в один экземпляр сетки, чтобы все они могли быть отрендерены за один вызов GPU. PlayCanvas предоставляет удобную функцию на компонентах Model, Sprite и Element, которая позволяет назначать эти компоненты на группы объединения (batch groups), которые дают движку подсказки о том, как объединять сетки для сокращения общего количества вызовов отрисовки.
Движок применяет различные правила для определения возможности объединения экземпляров сетки. Основное правило заключается в том, что все экземпляры сетки должны использовать один и тот же материал.
Распространенные случаи использования объединения:
- Объединение статической геометрии - например, окружения - в один экземпляр сетки или несколько больших экземпляров для сокращения вызовов отрисовки, но при этом поддерживая отсечение камеры.
- Объединение динамической геометрии - например, набор движущихся объектов - в один экземпляр сетки с динамическими свойствами, которые применяются на GPU.
Создание групп пакетов
Группы пакетов могут быть созданы из раздела Группы пакетов на панели настроек сцены. Каждая группа пакетов имеет ряд свойств, которые используются для предоставления подсказок движку о том, как создавать пакеты из этой группы пакетов.
Свойства группы пакетов
- Имя: Используется для различения разных групп пакетов, в идеале оно должно описывать типы объектов, которые будут в этой группе пакетов. Это имя доступно во время выполнения для получения группы.
- Динамический: Если включено, то объекты внутри группы пакетов могут перемещаться/вращаться/масштабироваться. Вы можете использовать это для объектов, которые похожи друг на друга и используют одни и те же материалы, например, пули. Статические группы используют меньше ресурсов во время выполнения, поэтому вы должны отключить динамический режим, если содержимое группы пакетов не будет перемещаться.
- Максимальный размер AABB: Максимальный размер любой стороны ограничивающего прямоугольника, содержащего все объекты в группе пакетов на момент создания пакетов. Если набор сеток больше максимального размера, будут созданы несколько пакетов для рендеринга. Больший ограничивающий прямоугольник будет отображаться с меньшим количеством вызовов рисования, но будет работать хуже с отсечением камеры.
Добавление компонента в группу пакетов
Компонент Model имеет свойство Batch Group для назначения модели в группу пакетов.
Правила объединения экземпляров сетки
Правила, определяющие, может ли движок объединять экземпляры сетки, довольно сложны, но хорошим обобщением является то, что все экземпляры сетки, принадлежащие одному пакету, должны соответствовать следующим условиям:
- Иметь одинаковый идентификатор группы пакетов (Batch Group ID)
- Иметь одинаковый материал
- Иметь одинаковые параметры шейдера
- Быть внутри ограничивающего прямоугольника, у которого нет стороны, больше максимального размера AABB
- Быть в одном слое
- Каждый пакет имеет максимальное количество вершин 65535
- Для динамических пакетов существует максимальное количество подвижных экземпляров сетки. Это зависит от оборудования, но максимум составляет 1024.
Если группа пакетов содержит компоненты или экземпляры сетки, которые не соблюдают все правила, группа пакетов будет создавать несколько пакетов таким образом, чтобы каждый отдельный пакет содержал экземпляры сетки, которые следуют всем правилам.
Запуск переупаковки
На основе групп пакетов движок создает оптимизированную версию экземпляров сетки. Дальнейшие изменения многих свойств исходных экземпляров сетки не отражаются в оптимизированных версиях. Чтобы обеспечить хорошую производительность с использованием пакетов, а также разрешить некоторые дополнительные обновления, вы можете запросить движок для переупаковки отдельных групп пакетов после внесения изменений в исходные экземпляры сетки. Это часто полезно для компонентов элементов пользовательского интерфейса, где вы можете настроить пакеты, но все еще нужно выполнять редкие обновления. Обратите внимание, что переупаковка группы - это потенциально дорогостоящая операция. Во многих случаях влияние переупаковки можно свести к минимуму, разделив элементы, которые нуждаются в обновлении, на отдельные группы пакетов.
Вот пример простого скрипта. Скрипт обновляет textureAsset
на элементе и помечает группу пакетов как грязную.
Issue Tracker
Если вы нашли ошибку или у вас есть предложение, пожалуйста, создайте новый тикет в Issue Tracker.
Учебные материалы
- Shader Graph Tutorials - официальный плейлист с видеоуроками по Shader Graph на YouTube.
- Shader Graph Examples Library - библиотека примеров для Shader Graph.
Содержание
- Создание и использование Shader Graph
- Редактор Shader Graph
- Узлы
- Инспекторы
- Создание узлов
- Соединение узлов
- Работа с узлами
- Сохранение и загрузка графов
Создание и использование Shader Graph
- Создайте новый
Material Asset
в папкеAssets
. - Выберите созданный
Material Asset
и откройтеMaterial Inspector
. - В
Material Inspector
выберитеShader
и нажмите кнопкуCreate Shader Graph
. - Созданный
Shader Graph
будет автоматически применен к выбранномуMaterial Asset
. - Для редактирования
Shader Graph
дважды кликните по нему в папкеAssets
.
Редактор Shader Graph
Редактор Shader Graph состоит из следующих частей:
Graph Editor
- основная область, где вы создаете и редактируете графы.Node Inspector
- панель, где вы можете настроить параметры узлов.Texture Inspector
- панель, где вы можете просматривать и настраивать текстуры.Graph Inspector
- панель, где вы можете настроить параметры графа.
Узлы
Узлы - это основные элементы графа, которые представляют различные операции и функции. Узлы могут быть соединены друг с другом для создания сложных эффектов и материалов.
Инспекторы
Инспекторы позволяют настраивать параметры узлов, текстур и графов. Вы можете открыть инспектор, выбрав соответствующий элемент в редакторе Shader Graph.
Создание узлов
Чтобы создать узел, щелкните правой кнопкой мыши в области Graph Editor
и выберите нужный узел из контекстного меню.
Соединение узлов
Чтобы соединить узлы, перетащите порт одного узла на порт другого узла. Порты совместимых типов будут подсвечены зеленым цветом.
Работа с узлами
Вы можете перемещать, копировать, вставлять и удалять узлы, используя стандартные команды и сочетания клавиш.
Сохранение и загрузка графов
Чтобы сохранить граф, нажмите Ctrl+S
или выберите File > Save
в меню. Чтобы загрузить граф, дважды кликните по нему
в папке Assets
.
// изменить textureAsset на элементе
element.textureAsset = this.hoverAsset;
// если у этого элемента установлена группа Batch Group, отметьте ее как грязную, чтобы перестроить группу в следующем кадре
if (element.batchGroupId)
this.app.batcher.markGroupDirty(element.batchGroupId);
Пример - Объединение статической среды
В этой сцене мы создали статическую среду из 7 отдельных файлов моделей, некоторые из которых повторяются на сцене. Например, плитка дороги используется в 50 сущностях для создания длинной дороги по центру сцены.
Вы можете увидеть на анимации каждый вызов рисования по мере его выполнения. В этой среде движок делает более 50 вызовов рисования для отрисовки каждой из моделей по отдельности. Однако, кроме земли, все эти модели используют один и тот же материал, и поэтому их можно объединить в группы пакетов.
На этой анимации мы создали 4 группы пакетов для зданий, кактусов, дороги и земли. Обратите внимание, что дорога и земля не объединяются в единые вызовы рисования, потому что сетки больше, чем максимальный размер AABB, определенный для группы пакетов.
Терминология
- Группа пакетов (Batch Group) - Именованная группа, созданная в редакторе, которая определяет некоторые подсказки о том, как должны объединяться экземпляры сеток. Компоненты назначаются группе пакетов
- Batch - Объект движка, созданный во время выполнения, который представляет собой набор экземпляров сетки, отображаемых в одном вызове рисования. Группа пакетов может привести к созданию нескольких пакетов, в зависимости от свойств экземпляров сетки, добавленных в группу пакетов.
- Batch Manager - Программный интерфейс для создания и обновления пакетов во время выполнения. См. API документацию.