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

Какой ресурс ПК используется Dynamic Batching?

2.3 Middle🔥 251 комментариев
#Unity Core#Оптимизация#Рендеринг и графика

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

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

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

Отличный и очень практичный вопрос! Он проверяет понимание внутренней "кухни" Unity, что критически важно для оптимизации.

Краткий ответ

Dynamic Batching в Unity в первую очередь и интенсивно использует ЦПУ (CPU), выполняя на нем работу по преобразованию вершин, их группировке и подготовке данных для отправки в графический конвейер. Его основная цель — снизить нагрузку на графический процессор (GPU) за счет уменьшения количества вызовов отрисовки (draw calls), что является ключевым узким местом в рендеринге.

Подробный анализ использования ресурсов

Чтобы понять, почему CPU — главный "потребитель", нужно разобрать процесс по шагам.

1. Работа на CPU: Тяжелая подготовительная работа

Когда Dynamic Batching активен, движок в рантайме на каждом кадре выполняет следующие задачи на CPU:

  • Проверка условий батчинга: Для каждого объекта CPU проверяет, удовлетворяет ли он множеству критериев (одинаковый материал, небольшое количество вершин (< 900 для стандартного шейдера), отсутствие масштаба в мире, совпадение настроек освещения и т.д.).
  • Трансформация вершин в мировое пространство: Это самая затратная часть. Для всех мешей, которые можно сбатчить, CPU вручную преобразует их локальные вершины в мировые координаты. Этот расчет обычно выполняется шейдерами на GPU. Код батчера выполняет работу, аналогичную вершинному шейдеру, но на CPU.
  • Создание единого большого вершинного буфера: Преобразованные вершины из множества мелких мешей упаковываются в один непрерывный блок памяти.
  • Подготовка единого вызова отрисовки: Формируется команда (DrawCall) для отправки на GPU, которая говорит: "Отрисуй этот один большой буфер с вершинами с таким-то материалом".

Пример упрощенной логики на C# (как это происходит внутри):

// Псевдокод, иллюстрирующий работу Dynamic Batching на CPU
void ProcessDynamicBatchingFrame(List<MeshRenderer> renderers) {
    List<Vertex> batchedVertices = new List<Vertex>();
    List<int> batchedIndices = new List<int>();

    foreach (var renderer in renderers) {
        if (CanBatch(renderer, currentMaterial)) {
            // 1. Трансформация вершин на CPU (дорогая операция!)
            Matrix4x4 worldMatrix = renderer.transform.localToWorldMatrix;
            foreach (var localVert in renderer.mesh.vertices) {
                Vertex worldVert = TransformVertex(localVert, worldMatrix);
                batchedVertices.Add(worldVert);
            }
            // 2. Конкатенация индексов
            batchedIndices.AddRange(AdjustIndices(renderer.mesh.triangles, batchedVertices.Count));
        }
    }

    // 3. Один вызов отрисовки вместо многих
    Graphics.DrawMeshNow(CreateBatchedMesh(batchedVertices, batchedIndices), currentMaterial);
}

2. Эффект на GPU: Значительное облегчение нагрузки

Именно здесь проявляется выгода:

  • Резкое сокращение Draw Calls: Вместо десятков или сотен отдельных команд DrawMesh, GPU получает одну или несколько. Это снижает оверхед драйвера графики и позволяет GPU больше времени заниматься непосредственно растеризацией и вычислениями шейдеров.
  • Снижение состояния изменений (state changes): Часто сбатченные объекты используют один материал, что означает меньше переключений текстур, шейдеров и прочих параметров конвейера — операций, которые "дороги" для GPU.

3. Использование памяти (RAM)

Происходит дополнительное потребление оперативной памяти (RAM):

  • Временные буферы: Для хранения преобразованных вершин и индексов на стороне CPU требуется выделение памяти (часто в управляемых кучах, что может провоцировать сборку мусора, если не оптимизировано).
  • Отсутствие экономии видеопамяти (VRAM): Исходные меши все еще загружены в VRAM. Dynamic Batching создает новые, трансформированные данные на лету каждый кадр, не экономя место в видеопамяти.

Сводная таблица использования ресурсов

РесурсИспользованиеЭффект
CPUОчень высокое. Трансформация вершин, проверка условий, подготовка буферов.Основная нагрузка. Может стать узким местом на мобильных устройствах или при большом количестве объектов.
GPUСнижается. За счет уменьшения количества draw calls и state changes.Основная выгода. Повышение производительности рендеринга, особенно на CPU-bound сценах.
RAMУмеренное. Временные буферы для сбатченных данных.Риск повышенной аллокации и сборки мусора (Garbage Collection), если реализация неэффективна.
VRAMНейтральное/Незначительное. Исходные меши остаются в памяти.Не экономит и не увеличивает использование видеопамяти существенно.

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

Dynamic Batching — это компромисс: мы тратим ресурсы CPU, чтобы сэкономить ресурсы GPU.

  • Когда использовать: Идеально для статических UI-элементов, простой 2D-графики или небольшого количества простых объектов, которые часто меняют положение (например, монеты, пули). На платформах, где GPU слабее CPU (некоторые мобильные SoC), он может дать прирост.
  • Когда отключать:
    *   На объектах со сложными мешами (>300 вершин). Затраты CPU на трансформацию перевешивают выгоду.
    *   На платформах, где **CPU является узким местом** (типично для мобильных устройств с большим количеством объектов).
    *   Для статических объектов окружающей среды. Для них существует **Static Batching**, который выполняет преобразование вершин **один раз** на этапе сборки (Build time), а не каждый кадр, что снимает нагрузку с CPU.

Итог: Планируя использовать Dynamic Batching, вы должны всегда профилировать свой проект, следя за нагрузкой на CPU (в частности, за временем, проводимым в рендеринге) и за количеством Batched Draw Calls в окне Stats или Frame Debugger. Это ваш главный инструмент для принятия взвешенного решения.

Какой ресурс ПК используется Dynamic Batching? | PrepBro