Уявіть: ваша мобільна гра гальмує на 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 робочий день. Зв'яжіться з нами — отримайте консультацію та комерційну пропозицію.







