На Android mid-range устройстве GPU Profiler показывает 18 мс на кадр при целевых 16.6 мс — игра не держит 60 FPS. Комбинация из 340 draw calls, overdraw-тяжёлых эффектов и текстур 2048×2048, которые на экране занимают 64×64 пикселя — каждый фактор по отдельности терпим, вместе — катастрофа.
Почему оптимизация графики под мобильные платформы требует комплексного подхода?
Мобильные GPU — tile-based: они разбивают кадр на тайлы и рендерят последовательно. Это делает их чувствительными к overdraw и fill rate. В отличие от десктопа, где immediate mode GPU прощает больше, на мобильном устройстве каждый лишний draw call или пиксельный шейдер бьёт по производительности. Мы объединяем профилирование, сжатие текстур, настройку батчинга и шейдеров в единый процесс — иначе результата не будет.
Как измерить и сократить draw calls?
Draw Call — это команда CPU отрисовать группу треугольников с определёнными настройками. Каждый draw call требует синхронизации 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 — батчинг не работает.
- GPU Instancing масштабируется лучше при большом количестве копий одного объекта (деревья, камни, враги одного типа). Dynamic Batching для мелких объектов (до 900 вертексов) работает автоматически, но на практике его отключают ради 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-устройств. Некомпрессированная RGBA32 текстура 2048×2048 = 16 MB. 10 таких текстур на уровне = 160 MB только на текстурах.
Форматы сжатия с аппаратной поддержкой — оптимизация графики под
| Формат | Бит на пиксель | Поддержка |
|---|---|---|
| ETC2 без альфы | 4 bpp | Android, iOS (через ASTC?) |
| ETC2 с альфой | 8 bpp | Android |
| ASTC 4×4 | 8 bpp | iOS, Android (Adreno 400+, Mali G7x+) |
| ASTC 6×6 | 3.5 bpp | iOS, Android (новые) |
| ASTC 8×8 | 2 bpp | iOS, Android (высокое сжатие) |
| DXT5 (BC3) | 8 bpp | PC |
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-спрайтов.
В одном из проектов — мобильная 3D стратегия — при запуске кампании игра падала с OOM на устройствах с 512 MB RAM. Memory Profiler показал 380 MB только на текстурах. Аудит выявил: 60% текстурного бюджета занимали текстуры terrain и environment в формате RGBA32 без сжатия (разработчик отключил сжатие на этапе прототипирования и забыл вернуть), ещё 15% — UI-текстуры с включёнными мипмапами. Решение: перевод всех terrain/environment текстур в ASTC 6×6, UI-текстуры в ASTC 8×8 без мипмапов, для эффектов с альфой — ASTC 4×4. Итог: 142 MB. OOM-крэши прекратились, освободилось 240 MB для игровой логики и звука.
Почему overdraw особенно критичен на мобильных GPU?
Overdraw — это рендеринг одного пикселя несколько раз. Полупрозрачные партикулы, сложные постпроцессинговые эффекты, перекрывающиеся UI-элементы — всё это overdraw. На tile-based мобильных GPU overdraw особенно дорог: каждый раз, когда тайл памяти читается и записывается повторно, это дополнительная работа.
Визуализировать 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. Проверить поддержку ASTC на устройстве можно через SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_6x6).
| Задача | Сроки |
|---|---|
| Аудит производительности + отчёт с рекомендациями | 2–5 дней |
| Оптимизация текстур и материалов (одна сцена) | 3–7 дней |
| Комплексная оптимизация графики (весь проект) | 2–6 недель |
| Оптимизация под конкретное минимальное устройство | 1–3 недели |
Что входит в нашу работу по оптимизации?
- Детальный аудит производительности с полным отчётом и рекомендациями
- Пережатие текстур с выбором оптимальных форматов для каждой платформы
- Настройка батчинга, инстансинга и шейдеров
- Профилирование и устранение узких мест (draw calls, overdraw, memory)
- Консультация и обучение команды заказчика
- Гарантия результата: FPS и стабильность на целевых устройствах
Мы более 5 лет занимаемся оптимизацией мобильных игр, реализовали 20+ проектов на Unity и Unreal Engine. Свяжитесь с нами для аудита вашего проекта. Закажите оптимизацию и получите стабильный FPS на целевых устройствах.






