Представьте: ваша мобильная игра тормозит на Adreno 506, хотя графика скромная. Frame Debugger показывает 350 Draw Calls на кадр, а FPS проседает до 35. Цель — стабильные 60 FPS. Оптимизация Draw Calls — первый и самый эффективный шаг. Мы снижаем число вызовов со средних 300 до 150, поднимая FPS до 60 на mid-range устройствах без потери качества. Используем батчинг, GPU Instancing, атласы текстур. За 5 лет оптимизировали 30+ проектов. Свяжитесь с нами для аудита вашего проекта — это сэкономит ваши ресурсы.
Почему Draw Calls критичны для мобильных игр?
На мобильных GPU с тайловой архитектурой (Mali, Adreno, Apple GPU) каждый лишний Draw Call дороже, чем на десктопе. CPU тратит время на подготовку данных, а GPU — на переключение контекстов. В результате при хаотичном рендеринге FPS падает ниже целевых 30 или 60 FPS. Оптимизация Draw Calls — один из самых эффективных способов повысить производительность без изменения контента.
Откуда берутся лишние вызовы
Три главных источника.
Разные материалы на похожих объектах. Каждый уникальный материал = минимум один отдельный Draw Call. Часто видим проекты, где монеты, враги и бонусы используют разные текстуры (PNG разных размеров), упакованные в разные атласы. Batch для них невозможен.
Dynamic batching ломается незаметно. Unity батчит меши только если они меньше 900 вершин, используют один материал и не имеют статичного флага. Добавление тени (Shadow Casting = On) на динамический объект автоматически выбивает его из батча — это не очевидно из документации.
Skinned mesh без GPU Instancing. Анимированные персонажи с SkinnedMeshRenderer не участвуют ни в static batching, ни в dynamic batching. Если на экране 20 врагов с одинаковым мешем, но без GPU Instancing — 20 отдельных Draw Calls.
Как снизить Draw Calls без потери качества?
Sprite Atlas для 2D
Для 2D-игр — SpriteAtlas (не устаревший Sprite Packer). Все спрайты одного игрового слоя — в один атлас, один материал, один Draw Call для всего слоя. Атлас должен быть Include in Build, иначе в рантайме подгрузятся отдельные текстуры. Максимальный размер атласа на мобильных — 2048×2048 для большинства устройств, 4096×4096 допускается для Android API 26+ и iOS 12+. Используем ASTC 6×6 для обоих: хорошая компрессия без заметных артефактов.
GPU Instancing для 3D
Для повторяющихся объектов (враги, деревья, пули) — Enable Instancing на материале + шейдер с #pragma multi_compile_instancing. С Unity 2022+ можно использовать BatchRendererGroup для полного контроля. GPU Instancing не работает с анимацией на CPU — для анимированных врагов применяем GPU skinning через AnimationInstancing или вертексные шейдеры с запечёнными анимациями.
Static Batching
Статичные объекты (платформы, стены) помечаем как Static, включаем Static Batching в Player Settings. Unity объединит меши в build time. Оверхед: увеличение памяти, поэтому не помечаем статикой всё подряд.
Убираем лишние Shadow Casters
Тени — дорого. На мобильных часто отключаем real-time тени и заменяем blob shadow (простой dark circle спрайт под объектом). Если тени нужны — ограничиваем дистанцию и переходим на одну каскадную карту теней вместо четырёх.
Целевые метрики
| Устройство | Рекомендуемый максимум Draw Calls |
|---|---|
| Low-end Android (Adreno 505) | 80–120 |
| Mid-range Android (Adreno 618) | 150–200 |
| iPhone 12 / A14 | 200–300 |
| iPhone 15 / A17 | 300–400 |
Эти цифры — для 60 FPS. Если таргет 30 FPS, бюджет вдвое мягче. GPU Instancing эффективнее Dynamic Batching в 3–5 раз на мобильных.
Сравнение методов батчинга
| Метод | Применимость | Потребление памяти | Сложность настройки |
|---|---|---|---|
| Dynamic Batching | Объекты <900 вершин, один материал | Низкое | Минимальная |
| Static Batching | Статичные объекты | Высокое | Низкая |
| GPU Instancing | Повторяющиеся объекты | Среднее | Средняя |
Как диагностировать узкие места?
Unity Frame Debugger (документация) — первый шаг. Показывает каждый Draw Call в кадре с объяснением, почему батчинг не произошёл. Snapdragon Profiler (для Android на Adreno) и Xcode GPU Frame Capture (iOS) дают детальную картину на реальном железе, включая time per draw call. RenderDoc — для глубокого анализа.
Типичные ошибки при оптимизации Draw Calls
- Не смотреть на реальное устройство — эмулятор не покажет тайловую архитектуру.
- Забывать выключить тени при тесте батчинга.
- Использовать один большой атлас вместо нескольких по слоям.
- Пытаться батчить анимированные объекты без GPU Instancing.
Что входит в работу
- Аудит Frame Debugger и Snapdragon Profiler
- Внедрение Sprite Atlas и GPU Instancing
- Оптимизация теней и статического батчинга
- Тестирование на 5+ реальных устройствах (low-end, mid-range)
- Документация по поддержке оптимизаций
- Гарантия 6 месяцев на производительность (прирост FPS минимум 20% на low-end)
Процесс работы
- Анализ текущего состояния (1 день)
- Приоритизация проблем (1 день)
- Реализация атласов/инстансинга/батчинга (2–5 дней в зависимости от сложности)
- Тестирование на low-end и mid-range устройствах (1 день)
- Финальный отчёт и передача правок
Сроки зависят от масштаба: простая 2D-аркада — два-три дня, 3D с анимированными персонажами — неделя и больше. Оценим ваш проект за 1 рабочий день. Свяжитесь с нами — получите консультацию и коммерческое предложение.







