Оптимізація текстурних атласів для мобільних ігор
Sprite Atlas у Unity — інструмент зрозумілий, але його неправильна настройка стабільно прибавляє 40–100 МБ до пам'яті мобільного додатку та ламає batching там, де його очікуєш. Типова помилка: розробник включив Sprite Atlas, складав всі UI-спрайти в один атлас, задоволений — Draw Calls упали з 80 на 12. Але забув включити Include in Build в настройках атласу. В результаті атлас генерується в Edit Mode, але в Release-білді кожен спрайт завантажується окремою текстурою.
Або інша історія: атлас настроєний правильно, batching працює, але розмір атласу 2048×2048 RGBA32 — це 16 МБ тільки на одну текстуру без mipmaps. На пристрої з 2 ГБ RAM сумарний UI-атлас з 4 листів їдає 64 МБ. При переключенні мов (різний набір символів) — всі 4 листи в пам'яті одночасно.
Формати сжиття — там теряється більше всього
Це найбільш недооцінена частина оптимізації текстур. Розробники часто залишають RGBA32 або RGBA16 для всіх текстур, не задумуючись.
ASTC — стандарт для сучасних мобільних пристроїв (iOS A7+, Android з 2015+). Підтримує блочне сжиття з настроюваною якістю: ASTC 4×4 дає високу якість при 8 bpp, ASTC 8×8 — прийнятну якість при 2 bpp. Для атласів UI використовуємо ASTC 4×4 або 6×6. Для фонових текстур без дрібних деталей — ASTC 8×8.
ETC2 — fallback для Android-пристроїв без підтримки ASTC. Підтримує альфа-канал (на відміну від ETC1). Для старих проектів з мінімальним Android API level = 19 — все ще актуальний.
PVRTC — формати для iOS (PowerVR GPU). Потребує текстури квадратної форми зі стороною в степень двойки. Якщо атлас 1024×512 — PVRTC застосувати не можна без зміни розміру.
Реальний кейс: казуальна гра-пазл, Android+iOS. UI-атласи займали 128 МБ в пам'яті (RGBA32, 4 листи 2048×2048). Після переключення на ASTC 6×6 для iOS та ETC2 для Android: 128 МБ → 22 МБ. Якість на екрані телефона — невідрізнима. Час завантаження UI-сцени знизився з 1.8 с до 0.4 с.
Стратегія розбиття атласів
Не всі спрайти в один атлас — це шлях до проблем. Правильна стратегія:
Розбиття по сцені/екрану. Спрайти, які використовуються тільки в меню — в атлас menu_atlas. Спрайти геймплею — в gameplay_atlas. Загальні елементи (кнопки, рамки, іконки) — в common_atlas. Це дозволяє виявляти невикористовувані атласи при зміні сцени.
Атласи по частоті використання. Hotpath-спрайти (HP-бар, прицільник, таймер) завжди в пам'яті → core_hud_atlas. Рідкі екрани (настройки, магазин) — виявляються через Addressables при закритті екрана.
Обмеження розміру листа атласу. 2048×2048 — максимум для мобільних. Частина пристроїв з Android 4.4 не підтримує 4096×4096 для сжатих форматів. У Sprite Atlas Settings встановлюємо Max Texture Size = 2048.
Дубликати в кількох атласах. Unity Addressables Analyze → Check Duplicate Bundle Dependencies виявляє спрайти, що потрапили в кілька атласів. Це означає, що один і той же спрайт завантажується в пам'ять двічі. Типова причина: shared-спрайт (іконка валюти) використаний і в меню, і в геймплеї без явного зазначення атласу.
Mipmaps для мобільних атласів
Для UI-атласів mipmaps вимикаємо. UI рендериться в Screen Space, об'єкти не віддаляються від камери — mipmaps бесполезні та збільшують розмір текстури на 33%. У Texture Import Settings: Generate Mipmaps = false.
Для ігрових текстур (3D-об'єкти, задній план у 2D з масштабуванням) — mipmaps обов'язкові. Без них aliasing та завищена texture fetch bandwidth.
Workflow атласування в проекті
Використовуємо Sprite Atlas V2 (Legacy V1 застарів, але все ще зустрічається в старих проектах). V2 підтримує Work with Packages та правильно працює з Addressables.
Настройки атласу для мобільного проекту:
- Pack on Play Mode = Always Enabled (для коректного Preview в Editor)
- Allow Rotation = true (щільніше упаковує спрайти)
- Tight Packing = true (зменшує пусте простір)
- Padding = 4 (запобігає texture bleeding при ASTC-сжиттю)
| Масштаб задачі | Орієнтовні терміни |
|---|---|
| Аудит атласів + звіт з рекомендаціями | 1–2 дня |
| Переробка атласної стратегії (1 платформа) | 3–7 днів |
| Повна оптимізація текстур для Android + iOS | 2–4 тижні |
| Інтеграція з Addressables + керування пам'яттю | 2–3 тижні |
Вартість розраховується індивідуально після аудиту ассетів та цільових платформ.





