Скарга «гра гальмує» — це не діагноз. Гальмує тому що CPU не встигає до GPU, тому що GC збирає сміття, тому що текстури не поміщаються у VRAM, тому що шейдер занадто важкий для Adreno 618, або тому що на iOS змінилася поведінка Metal. Без профілювальника це ворожіння. З ним — конкретні числа і конкретний винуватець.
Ми профілювали понад 100 мобільних ігор — від гіперказуалок до AA-проєктів. За 5 років на ринку накопичили базу типових проблем і готових рішень. У цій статті розберемо, як ми знаходимо вузькі місця і що входить у результат. Якщо вам потрібно швидко оцінити продуктивність вашої гри — зв'яжіться з нами, оцінимо проєкт за 1-2 дні.
Як ми проводимо профілювання продуктивності мобільної гри?
Процес складається з кількох етапів. Спочатку вибираємо цільовий пристрій — той, на якому гра гальмує. Потім підключаємо профілювальники і збираємо дані протягом як мінімум 10 хвилин геймплею, щоб зафіксувати тротлінг. Після аналізу видаємо звіт з конкретними метриками.
Unity Profiler — відправна точка. Режим Deep Profile уповільнює гру, але показує всі виклики з алокаціями. Підключається до білду через Development Build + Autoconnect Profiler або через USB. Обов'язково дивимося на девайсі, не в редакторі: на редакторі інший GC, інший рендер бекенд, інші затримки.
Ключові маркери в CPU трейсі:
-
GC.Collect— збірка сміття. Якщо > 1 мс і відбувається частіше ніж раз на кілька секунд — проблема з алокаціями в hot path -
Camera.Render→RenderForwardOpaque.Render— основне навантаження на GPU -
Physics.Processing— фізика. Якщо > 3 мс при 60 FPS бюджеті — забагато колайдерів або неоптимальні налаштування Fixed Timestep
Android GPU Inspector (AGI) — для Android на Qualcomm або Mali. Показує GPU time per draw call, pipeline bubbles, зайнятість ALU. Критично для розуміння, що саме на GPU важко: геометрія, overdraw або fill rate. За даними AGI documentation, pipeline bubbles можуть займати до 40% часу кадру на старих пристроях.
Xcode Instruments — для iOS. Використовуємо Metal System Trace для GPU, Time Profiler для CPU, Allocations для пам'яті. Thermal State в Instruments показує, коли пристрій починає тротлити через перегрів — часта причина нестабільного FPS через кілька хвилин гри.
Snapdragon Profiler — альтернатива AGI для Adreno. Простіший у налаштуванні для snapshot-режиму, добре показує ефективність шейдерів. При порівнянні з AGI, AGI у 2 рази точніше визначає pipeline bubbles.
Як відрізнити CPU-bound від GPU-bound?
Ознака CPU-bound: VSync чекає GPU менше 1 мс (GPU встигає), але кадр все одно займає 20+ мс. Отже CPU — пляшкова шийка.
Найчастіше винуватець — методи Update() з важкою логікою, LINQ-запити в hot path (кожен створює алокацію), або FindObjectsOfType всередині Update (O(n) по всіх об'єктах сцени). У Memory Profiler це видно як постійний GC.Alloc у кілька КБ кожен кадр.
Рішення: перехід на Data-Oriented Technology Stack (DOTS/ECS) для масових об'єктів, або мінімально — кешування результатів, заміна LINQ на явні цикли, Event-driven архітектура замість поллінгу.
Ознака GPU-bound: GPU time високий, але кількість Draw Calls невелика. В AGI видно високий Fragment Shader час.
Overdraw — малювання одних і тих самих пікселів кілька разів через накладання прозорих об'єктів. У Unity можна побачити в режимі Overdraw у Scene View. Темно-червоні області — малюємо кожен піксель 4+ разів. Характерно для 2D-ігор з безліччю шарів частинок.
Рішення: сортування прозорих об'єктів, обмеження одночасно активних партиклів, заміна прозорих спрайтів на непрозорі там, де художньо можливо.
Чому тепловий тротлінг — часта проблема?
На iPhone через кілька хвилин інтенсивного геймплею температура процесора досягає порогу, і iOS знижує частоту CPU/GPU. FPS падає з 60 до 40–45 без жодної зміненої нагрузки в самій грі. Перевіряється через ProcessInfo.thermalState (iOS) — при .serious або .critical варто знижувати якість графіки превентивно.
На Android аналогічний механізм — PowerManager.getThermalHeadroom() (API 29+). У 70% випадків тротлінг починається після 5-7 хвилин гри.
Що входить у наш звіт про профілювання?
За підсумками профілювання видаємо звіт із конкретними маркерами: що гальмує, на якому пристрої відтворюється, скільки мс займає, і рекомендація щодо виправлення з пріоритетом. Не «оптимізуйте фізику», а «FixedUpdate у EnemyAI.cs викликає Physics2D.OverlapCircleAll кожні 20 мс при 200 активних ворогах — сумарно 4.2 мс CPU, переписати на Physics2D.OverlapCircleNonAlloc з пулом результатів».
Приклад структури звіту
- Проблема: GC Spike кожні 5 секунд (20 мс) - Причина: алокації рядків в Update() - Рекомендація: замінити на StringBuilder, пріоритет High - Очікуваний ефект: зниження GC часу до 2 мсДодатково надаємо:
- доступ до профілювальних логів і скріншотів знімків,
- навчання команди з використання інструментів,
- підтримку при впровадженні виправлень протягом 10 робочих днів.
Терміни: аудит і звіт — три робочих дні. Реалізація виправлень за результатами — окрема оцінка від 5 днів.
| Інструмент | Платформа | Основне призначення |
|---|---|---|
| Unity Profiler | iOS/Android | CPU та GC профілювання |
| Android GPU Inspector | Android (Qualcomm/Mali) | GPU pipeline, shader efficiency |
| Xcode Instruments | iOS | GPU, CPU, Memory, Thermal State |
| Snapdragon Profiler | Android (Adreno) | Альтернатива AGI для Adreno |
Порівняння інструментів за точністю виявлення вузьких місць:
| Характеристика | Unity Profiler | AGI | Xcode Instruments |
|---|---|---|---|
| CPU bound | Відмінно | Ні | Відмінно |
| GPU bound | Середньо | Відмінно | Відмінно |
| Тепловий тротлінг | Непрямо | Ні | Безпосередньо |
| Overdraw | Середньо | Відмінно | Добре |
Ми гарантуємо точність кожного виміру — всі результати відтворювані на однакових девайсах. Сертифіковані інженери (Unity Certified Developer, Apple Certified iOS Developer) проводять аудит. Досвід — 5+ років і 100+ проєктів. Отримайте консультацію по вашому проєкту — зв'яжіться з нами, щоб обговорити деталі.







