Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Оптимизация Draw Calls в Unity
Уменьшение количества draw calls — критическая задача для производительности игры. Draw call — это команда, отправляемая видеокартой для отрисовки объекта. Каждый вызов требует переключения состояния графического конвейера, что является узким местом даже на мощном оборудовании.
Основные техники оптимизации
1. Batching (объединение объектов)
-
Static Batching: объединение статичных объектов в один меш на этапе разработки. Экономит draw calls за счёт снижения данных, отправляемых на видеокарту. Увеличивает использование памяти, но для статичных объектов это приемлемо.
-
Dynamic Batching: автоматическое объединение динамичных объектов за один вызов. Работает для объектов с одинаковым материалом, если их меш содержит менее 900 вертексов (для SkinnedMeshRenderer — менее 300).
-
GPU Instancing: техника рендеринга множества одинаковых объектов за один draw call. Используется для травы, деревьев, врагов. Требует специального шейдера с поддержкой instancing.
// Включение GPU Instancing в материале
material.enableInstancing = true;
2. Atlas текстур и материалы
-
Используй Atlas вместо отдельных текстур. Один draw call может отрисовать разные объекты, если они используют одну текстуру с разными UV координатами.
-
Минимизируй количество уникальных материалов. Один материал — один draw call за набор объектов.
3. Управление LOD (Level of Detail)
Создавай несколько версий модели разного качества. На дальних дистанциях используй более простые версии.
LODGroup lodGroup = GetComponent<LODGroup>();
// LOD Group автоматически выбирает уровень детализации
4. Occ Culling (окклюзионный culling)
Отключай рендеринг объектов, скрытых за другими. Unity автоматически подсчитывает видимость.
5. Отключение ненужных компонентов
- Отключай камеры, источники света, частицы, которые не видны.
- Используй Frustum Culling (отсечение за границами камеры) — включено по умолчанию.
6. Оптимизация UI
- UI Canvas каждого экрана требует отдельного draw call. Группируй элементы в один Canvas.
- Избегай пересоздания UI элементов часто — это вызывает rebuild Canvas.
Практический пример
// Правильно: используй GPU Instancing для рекурсивного рендеринга
Graphics.DrawMeshInstanced(mesh, 0, material, matrices, count);
// Неправильно: каждый объект отдельно
for (int i = 0; i < objects.Count; i++) {
Graphics.DrawMesh(objects[i].mesh, objects[i].transform.localToWorldMatrix, material, 0);
}
Инструменты профилирования
Используй Profiler (Window → Analysis → Profiler) для просмотра количества draw calls. Вкладка Rendering показывает статистику вызовов. Frame Debugger позволяет пошагово просмотреть все операции рендеринга.
Выводы
Комбинируй несколько техник: batching + atlas + LOD + culling. Профилируй регулярно. Оптимизация draw calls часто даёт 2-3x улучшение FPS на мобильных устройствах.
Похожие вопросы
- Как работает Animator Controller в Unity? Что такое Animator State Machine?
- Объясните основные принципы ООП и как они реализованы в C#.
- Какие yield инструкции в корутинах вы знаете?
- Как работает сборщик мусора?
- Как работает Raycast в Unity и для чего он используется?
- Какие плюсы и минусы наследования от MonoBehaviour?
- Как работает State Machine в Animator?
- Как по ключу найти значение?
- Что подразумеваешь под производительностью в runtime?
- Где выполняются Coroutine?
- Что знаешь о памяти?
- В чём разница между Task и Thread?
- Для чего нужно скалярное произведение векторов в Unity?
- Какие знаешь подходы оптимизации UI?
- Какие знаешь паттерны?
- Как снизишь колличество draw calls?
- Какие знаешь механизмы полиморфизма?
- Для чего нужен Task?
- Как работает Equals со значимыми типами?
- Какие плюсы и минусы кастомного UI?