Статический и динамический batching

PlayCanvas — это мощная и гибкая игровая движок для создания 3D и 2D приложений в браузере с использованием JavaScript. Одной из ключевых особенностей PlayCanvas является его способность оптимизировать рендеринг с помощью batching. Batching позволяет эффективно обрабатывать множество объектов, минимизируя количество отдельных операций рендеринга. В PlayCanvas реализованы два типа batching: статический и динамический. Каждый из них имеет свои особенности и применяется в разных ситуациях для повышения производительности.

Статический batching

Статический batching — это процесс объединения объектов, которые не изменяются в ходе игры (например, статичные части сцены), в один большой объект. Таким образом, движок рендерит все эти объекты как единую группу, вместо того чтобы выполнять рендеринг для каждого объекта по отдельности. Это значительно снижает количество вызовов рендеринга и ускоряет процесс.

Преимущества статического batching:

  • Снижение количества draw calls: Когда множество объектов с одинаковыми материалами объединяются в один, движок выполняет один вызов рендеринга для всех этих объектов.
  • Увеличение производительности: Поскольку количество draw calls снижается, уменьшается нагрузка на процессор и видеокарту, что приводит к улучшению производительности, особенно на слабых устройствах.
  • Снижение использования памяти: Статический batching позволяет уменьшить количество объектов в сцене, что экономит память.

Ограничения статического batching:

  • Требования к статичности: Объекты, участвующие в статическом batching, должны быть статичными в течение всего времени работы игры. Если объект будет перемещен или изменен, он выйдет из группы статического batching.
  • Неоптимальные для динамических объектов: Этот метод не подходит для объектов, которые часто изменяются (например, анимация или перемещение объектов в сцене), поскольку каждый вызов изменения приведет к повторному объединению объектов, что будет неэффективно.

В PlayCanvas статический batching активируется автоматически для объектов, которые соответствуют определённым условиям. Для того чтобы объект был включен в статический batching, он должен использовать тот же материал и находиться в одном и том же слое сцены.

Пример использования:

// Создание объекта и добавление его в сцену
var entity = new pc.Entity();
entity.addComponent('model', {
    type: 'box'
});
entity.setLocalScale(10, 10, 10);
scene.root.addChild(entity);

// Активирование статического batching
entity.model.batch = true;

Динамический batching

Динамический batching работает по похожему принципу, но отличается от статического batching тем, что используется для объектов, которые изменяются или анимируются в процессе работы приложения. Он объединяет объекты, которые могут быть перемещены или изменены в реальном времени, в одну группу для повышения производительности.

Преимущества динамического batching:

  • Гибкость: Подходит для динамических объектов, которые меняют свою позицию или анимацию.
  • Автоматическое объединение: В отличие от статического batching, динамический batching автоматически объединяет объекты на основе текущего состояния сцены, без необходимости явного управления этим процессом.
  • Подходит для малых объектов: Этот метод хорошо работает с большим количеством небольших объектов, которые часто движутся или изменяются.

Ограничения динамического batching:

  • Ограничение на количество вершин: Для того чтобы динамический batching был эффективным, объединяемые объекты не должны превышать определённое количество вершин, иначе процесс объединения может стать затратным по времени.
  • Сложность управления: В отличие от статического batching, динамическое объединение объектов может быть сложнее с точки зрения производительности, особенно если объекты часто изменяются.

В PlayCanvas динамический batching активируется автоматически, если объекты используют одинаковые материалы и находятся в одном слое сцены. Однако для этого объекты не должны быть слишком сложными по своей геометрии.

Пример использования:

// Создание динамического объекта
var entity = new pc.Entity();
entity.addComponent('model', {
    type: 'sphere'
});
entity.setLocalPosition(0, 0, 0);

// Добавление объекта в сцену
scene.root.addChild(entity);

// Динамический batching активируется автоматически для объектов с одинаковыми материалами
entity.model.batch = true;

Сравнение статического и динамического batching

Статический batching:

  • Применяется к неподвижным объектам.
  • Требует, чтобы объекты использовали один материал.
  • Производительность улучшается за счет уменьшения количества draw calls.
  • Неэффективен для объектов, которые изменяются во время игры.

Динамический batching:

  • Подходит для динамичных объектов.
  • Объединяет объекты в один во время выполнения.
  • Идеален для множества маленьких объектов с одинаковыми материалами, которые меняются во время игры.
  • Может быть менее эффективен, чем статический batching, если объекты имеют сложную геометрию.

Когда использовать каждый метод?

Выбор между статическим и динамическим batching зависит от специфики игры и сцены. Если в сцене присутствуют множество статичных объектов, например, здания или ландшафт, лучше использовать статический batching для снижения количества draw calls и улучшения производительности. В случае с динамичными объектами, такими как движущиеся персонажи или анимации, следует использовать динамический batching, чтобы сохранить гибкость и при этом повысить производительность.

Важно помнить, что оба метода могут работать одновременно, и в некоторых случаях можно комбинировать статический и динамический batching для оптимальной производительности. Например, статические объекты могут быть объединены в один большой батч, а динамические — использовать динамическое объединение для меньших объектов, которые часто изменяются.

Заключение

Использование batching в PlayCanvas является мощным инструментом для оптимизации производительности, особенно в сложных сценах с большим количеством объектов. Правильный выбор между статическим и динамическим batching позволяет минимизировать количество вызовов рендеринга и эффективно управлять ресурсами, что приводит к значительному ускорению работы приложения.