← Назад к вопросам

Что такое Static Batching и Dynamic Batching? В чем разница?

1.3 Junior🔥 182 комментариев
#C# и ООП

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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 BatchingDynamic Batching
Состояние объектовСтатические (не двигающиеся)Динамические (движущиеся)
Время выполненияПрепроцессинг (при компиляции/загрузке)Каждый кадр во время выполнения
Ограничение на вершиныНет (может объединять сложные меши)Да (<300 вершин на объект)
Влияние на памятьВысокое (хранит объединенные данные)Низкое (буферы создаются временно)
Поддержка скининга/тенейНет (для статической геометрии)Очень ограниченная или отсутствует
Контроль разработчикаЯвный (метка Static в инспекторе)Автоматический (с учетом строгих правил)

Практические рекомендации

  • Используйте Static Batching для стационарной геометрии уровня: зданий, декораций, окружающей среды. Это даст максимальный выигрыш в производительности для таких объектов.
  • Dynamic Batching полезен для множества небольших движущихся объектов, например, пуль, частиц простой формы или собираемых предметов. Следите за ограничением по вершинам.
  • Если объекты не батчится, рассмотрите использование GPU Instancing для рендеринга множества одинаковых мешей с одним материалом, но разными свойствами (например, цветом). Это более современный и эффективный метод для определенных случаев.
  • Для сложных динамических объектов (персонажей) батчинг обычно недоступен, и оптимизация должна идти другими путями: оптимизация мешей, атласы текстур, эффективные техники освещения.

Понимание и грамотное применение этих двух типов батчинга позволяет значительно снизить нагрузку на CPU и повысить FPS в ваших проектах Unity, что является критически важным навыком для профессионального разработчика.

Что такое Static Batching и Dynamic Batching? В чем разница? | PrepBro