Что такое Static Batching и Dynamic Batching? В чем разница?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Static Batching и Dynamic Batching: Основные концепции оптимизации рендеринга в Unity
В Unity батчинг (или объединение рендеринга) — это ключевая техника оптимизации, направленная на снижение количества вызовов рисования (Draw Calls) к графическому API (например, OpenGL или DirectX). Каждый Draw Call — это затратная операция для CPU, которая передает данные (меши, материалы) GPU для отрисовки. Уменьшение их числа напрямую повышает производительность, особенно на мобильных устройствах или в сложных сценах.
Static Batching (Статическое объединение)
Static Batching — это процесс объединения нескольких статических объектов (не двигающихся и не изменяющихся в ходе выполнения) в один большой "виртуальный" меш для их совместного рендеринга одним Draw Call.
- Как работает: Unity предварительно, обычно на этапе компиляции или при запуске сцены, комбинирует меши объектов, которые используют один и тот же материал, в один внутренний буфер данных. При рендеринге этот буфер передается GPU за один раз.
- Ключевые требования и особенности:
* Объект должен быть **статическим**: его трансформация (положение, вращение, масштаб) не изменяется во время выполнения. В инспекторе Unity для этого нужно установить галочку **Static** (часто в контексте рендеринга).
* Объекты должны использовать **одинаковый материал**. Если материалы разные, батчинг не произойдет.
* Процесс требует **дополнительной памяти**: Unity хранит объединенные данные мешей в памяти, что увеличивает ее потребление.
* **Не работает** для объектов с уникальными материалами на каждом экземпляре или динамически изменяющимися мешами (например, процедурной геометрией).
// Пример: Объекты становятся статическими автоматически,
// если их префабы были помечены как Static при создании.
// На практике это делается в инспекторе Unity.
// Кодом можно, например, включить/выключить статичность:
gameObject.isStatic = true; // Но обычно это устанавливается заранее.
Dynamic Batching (Динамическое объединение)
Dynamic Batching — это автоматический процесс Unity во время выполнения, который пытается объединить рендеринг небольших, движущихся объектов, использующих один материал, в один Draw Call.
- Как работает: Каждый кадр Unity анализирует объекты, удовлетворяющие строгим критериям, динамически преобразует их вершины в мировое пространство и объединяет их в один буфер для рисования.
- Ключевые ограничения (очень важны!):
* **Максимум 300 вершин на меш:** Объект должен иметь меш с количеством вершин меньше этого лимита (включая все вершины меша, не только отображаемые).
* **Один материал:** Как и в статическом батчинге, материалы должны быть идентичными.
* **Только определенные трансформации:** Объекты не должны иметь **зеркального масштаба** (например, отрицательного масштаба по одной оси) или **несоответствующих преобразований** между собой и их родителями, если они находятся в иерархии.
* **Не применяется к объектам с скинингом** (например, анимированным персонажам) или объектам, получающим **динамические тени** (в некоторых конфигурациях).
// Dynamic Batching управляется автоматически Unity.
// Его можно включить/выключить в настройках рендеринга:
// (В меню Edit -> Project Settings -> Player -> Other Settings)
// Однако на уровне кода мы лишь создаем объекты, которые могут быть объединены:
// Пример создания нескольких простых объектов с одинаковым материалом:
public Material sharedMaterial;
void Start() {
for (int i = 0; i < 10; i++) {
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = new Vector3(i * 2, 0, 0);
cube.GetComponent<MeshRenderer>().material = sharedMaterial; // Ключ: одинаковый материал!
// Если куб имеет <300 вершин и нет зеркального масштаба,
// Unity может попытаться динамически объединить их.
}
}
Основные различия в таблице
| Критерий | Static Batching | Dynamic Batching |
|---|---|---|
| Состояние объектов | Статические (не двигающиеся) | Динамические (движущиеся) |
| Время выполнения | Препроцессинг (при компиляции/загрузке) | Каждый кадр во время выполнения |
| Ограничение на вершины | Нет (может объединять сложные меши) | Да (<300 вершин на объект) |
| Влияние на память | Высокое (хранит объединенные данные) | Низкое (буферы создаются временно) |
| Поддержка скининга/теней | Нет (для статической геометрии) | Очень ограниченная или отсутствует |
| Контроль разработчика | Явный (метка Static в инспекторе) | Автоматический (с учетом строгих правил) |
Практические рекомендации
- Используйте Static Batching для стационарной геометрии уровня: зданий, декораций, окружающей среды. Это даст максимальный выигрыш в производительности для таких объектов.
- Dynamic Batching полезен для множества небольших движущихся объектов, например, пуль, частиц простой формы или собираемых предметов. Следите за ограничением по вершинам.
- Если объекты не батчится, рассмотрите использование GPU Instancing для рендеринга множества одинаковых мешей с одним материалом, но разными свойствами (например, цветом). Это более современный и эффективный метод для определенных случаев.
- Для сложных динамических объектов (персонажей) батчинг обычно недоступен, и оптимизация должна идти другими путями: оптимизация мешей, атласы текстур, эффективные техники освещения.
Понимание и грамотное применение этих двух типов батчинга позволяет значительно снизить нагрузку на CPU и повысить FPS в ваших проектах Unity, что является критически важным навыком для профессионального разработчика.