Оптимізація графіки під мобільні платформи

Наша компанія з розробки відеоігор веде незалежні проекти, спільно з клієнтом створює ігри та надає додаткові операційні послуги. Досвід нашої команди дозволяє нам охопити всі ігрові платформи та розробити приголомшливий продукт, що відповідає баченню клієнта та перевагам гравців.

Від імерсивних застосунків до ігрових світів і 3D-сцен

Наша виділена команда для VR/AR/MR-розробки, Unity-продакшну і 3D-моделювання та анімації — з власними кейсами і презентаціями.

Відвідати персоналізований сайт
Показано 1 з 1 послугУсі 242 послуг
Оптимізація графіки під мобільні платформи
Складна
від 3 робочих днів до 2 тижнів
Часті питання

Наші компетенції

Які етапи розробки гри?

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    683
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    862
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    491
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    533

Оптимізація графіки під мобільні платформи

На Android mid-range пристрої 2023 року GPU Profiler показує 18 мс на кадр при цільових 16.6 мс—гра не утримує 60 FPS. Причина, як правило, не одна: 340 draw calls, кілька overdraw-важких ефектів, невпаковані текстури 2048×2048 на об'єктах, які займають 64×64 пікселя на екрані. Кожен з цих пунктів окремо некритичний. Разом—катастрофа.

Draw Calls: звідки вони беруться та як їх лічити

Draw Call—це команда CPU рендерити групу трикутників з певними налаштуваннями. Кожен потребує синхронізації CPU-GPU та передачі даних. На мобільних з tile-based GPU (PowerVR, Mali, Adreno) це дорожче, ніж на десктопних immediate mode GPU.

Інструменти: Unity Profiler (GPU Usage), Frame Debugger, детальний аналіз—RenderDoc на Android або Xcode Instruments на iOS. GPU Profiler прямо в редакторі показує кількість batch'ів та SetPass calls. Гарна ціль для мобільного проекту—до 100 draw calls на кадр, реалістична для mid-core—150–200.

Основні джерела зайвих draw calls:

Матеріали без батчингу. Static Batching об'єднує статичні об'єкти з однаковим матеріалом в один mesh при старті сцени. Умова: об'єкти повинні бути позначені Static в Inspector та використовувати однаковий Material. Один ассет матеріалу, не однакові налаштування—саме однаковий об'єкт в пам'яті. Якщо у двох об'єктів Material з ідентичними параметрами, але це різні Material Instance—батчинг не працює.

Dynamic Batching для дрібних об'єктів (до 900 вертексів) працює автоматично, якщо об'єкти використовують однаковий матеріал. Але на практиці Dynamic Batching часто відключають заради GPU Instancing—інстансинг масштабується краще при великій кількості копій одного об'єкту (дерева, камні, ворог одного типу).

Canvas Overlay режим у uGUI. Canvas у Screen Space - Overlay рендерится поверх всього, і кожна зміна в будь-якому UI-елементі (навіть мигання курсору в текстовому полі) позначає весь Canvas Dirty, перерахує mesh та робить окремий draw call. Для UI з анімованими елементами обов'язково розносити статичні та динамічні елементи по різних Canvas'ах.

Текстури: найбільш недооцінений джерело проблем з пам'яттю

Мобільні пристрої використовують Unified Memory Architecture: GPU та CPU поділяють одну пам'ять. 512 MB RAM—не рідкість для бюджетних Android-пристроїв у 2023–2024. Невпакована RGBA32 текстура 2048×2048 = 16 MB. 10 таких текстур на рівні = 160 MB тільки на текстурах.

Формати стиснення з апаратною підтримкою:

  • Android: ETC2 (без альфи—4 bpp, з альфою—8 bpp), ASTC 4×4 (8 bpp) або ASTC 6×6 (3.5 bpp)
  • iOS: ASTC 4×4 – ASTC 8×8 залежно від вимог до якості
  • PC: DXT5 (BC3) для RGBA, BC7 для високоякісних текстур

ASTC—найкращий варіант для iOS та сучасних Android (Adreno 400+ серії, Mali G7x та вище). На старих Android пристроях з OpenGL ES 2.0 ASTC не підтримується—потрібен ETC2 fallback. Unity дозволяє задати різні формати для різних платформ через Texture Importer.

Мипмапи—обов'язкові для 3D-об'єктів, не потрібні для UI. Мипмап додає 33% до розміру текстури в пам'яті, але для UI-елементів, які завжди рендеряться в нативній роздільності, це бесполезна трата. Перевіряємо через Texture Importer → Generate Mipmaps → відключити для всіх UI-спрайтів.

Кейс: зниження пам'яті з 380 до 140 MB

На проекті—мобільна 3D стратегія—при запуску компанії гра падала з OOM (Out of Memory) на пристроях з 512 MB RAM. Memory Profiler показав 380 MB тільки на текстурах.

Аудит: 60% текстурного бюджету займали текстури terrain та environment у форматі RGBA32 без стиснення—розробник вимкнув стиснення на етапі прототипування «для швидкості» та забув повернути. Ще 15%—UI-текстури з увімкненими мипмапами.

Рішення: переведення всіх terrain/environment текстур в ASTC 6×6 (основна цільова платформа—iOS, Android 7.0+ як мінімальний потрібний), UI-текстури в ASTC 8×8 без мипмапів. Для ефектів з альфою (частинки, VFX)—ASTC 4×4. Результат: 142 MB. OOM-крахи припинились, звільнилось 240 MB для ігрової логіки та звуку.

Шейдери та Overdraw

Overdraw—це рендеринг одного пікселя кілька разів. Напівпрозорі частинки, складні постпроцесингові ефекти, перекриваючи UI-елементи—все це overdraw. На tile-based мобільних GPU overdraw особливо дорогий: кожен раз, коли tile пам'яті читається та записується повторно, це додаткова робота.

Візуалізувати overdraw у Unity: Scene View → Render Mode → Overdraw. Білі плями = проблема. Особливо стежимо за particle systems—частинки часто рендеряють десятки напівпрозорих квадів один на одному в одній точці.

Для частинкових систем: обмежувати Max Particles, використовувати непрозорі або cutout шейдери де це візуально допустимо (cutout дорожче прозорого за fill rate, але дешевше за overdraw в глибину), сортувати частинки по Sorting Layer щоб мінімізувати перетин з геометрією.

Для шейдерів: прості Unlit шейдери у 3–5 разів дешевші Lit на мобільних пристроях. Для декорацій дальнього плану, тіней на землі, billboard-об'єктів Unlit достатньо. Lit шейдер з per-pixel lighting тільки для близького плану та ключових об'єктів.

Профілювання: інструменти в порядку використання

Розпочинаємо з Unity Profiler підключеним до пристрою через USB (Build → Development Build + Autoconnect Profiler). GPU Usage Profiler показує час рендеру за категоріями. Frame Debugger—детальний розбір draw calls. Memory Profiler—снімок пам'яті з розбивкою за категоріями.

Для Android додатково: Android GPU Inspector (AGI) для пристроїв з Adreno, Mali Performance Counters для Mali GPU. Вони показують fill rate utilization, texture bandwidth та cache hit rate—метрики, недоступні в Unity Profiler.

Завдання Строки
Аудит продуктивності + звіт з рекомендаціями 2–5 днів
Оптимізація текстур та матеріалів (одна сцена) 3–7 днів
Комплексна оптимізація графіки (весь проект) 2–6 тижнів
Оптимізація під конкретний мінімальний пристрій 1–3 тижні

Вартість визначається після аудиту проекту та аналізу поточних метрик продуктивності.