Створення атласів 2D-спрайтів для графіки ігор
Sprite Atlas — один з кількох інструментів оптимізації в 2D-розробці, який впливає одночасно на продуктивність рендерингу та швидкість завантаження. Десять окремих спрайтів у папці — десять текстурних біндингів при відрисуванні. Ті самі десять спрайтів в одному атласі — один біндинг. На мобільному пристрої різниця в draw calls між «без атласів» та «з правильними атласами» — 3–10×.
Але атлас — не просто «складати текстури в одну велику». Неправильно складений атлас дає артефакти, memory waste та не знижує draw calls так, як повинен.
Технічна база: TexturePacker
TexturePacker — стандартний інструмент для створення спрайтових атласів в геймдеві. Підтримує всі актуальні двигуни: Unity, Godot, Cocos2d, Phaser. Ключові настройки, які визначають якість атласу:
Algorithm. MaxRects BestShortSideFit — найкраща упаковка для більшості проектів (максимальне використання простору текстури). Basic — швидше, але гірше упаковка. Для продакшн-атласів — MaxRects.
Padding. Відстань між спрайтами в атласі. Без padding — bleeding артефакти: при рендерингу спрайта захоплюються пиксели сусідніх спрайтів. Стандарт: 2px padding. При використанні мипмапів — 4–8px (мипмапи змішують сусідні пиксели на нижчих рівнях).
Rotation. Дозволити TexturePacker повертати спрайти на 90° для кращої упаковки. Двигун повинен підтримувати це (Unity Sprite Atlas — так, деякі старі двигуни — ні).
Power of Two. Фінальний атлас повинен мати розміри кратні степені двойки: 512×512, 1024×1024, 2048×2048. GPU кешують текстури power-of-two ефективніше. Нестандартний розмір (наприклад 1000×800) на деяких GPU приводить до автоматичного апскейлу до найближчої степені двойки — memory waste.
Групування спрайтів в атласи
Найважливіше рішення: які спрайти об'єднати в один атлас.
Правило одного draw call. В один атлас об'єднуються спрайти, які рендеряться одночасно. UI-елементи головного меню — один атлас. Анімаційні кадри одного персонажа — один атлас. Тайли одного біому — один атлас. Змішувати UI, персонажів та тайли в один «загальний» атлас — антипаттерн: збільшує розмір текстури без зниження draw calls.
Ліміт розміру атласу. 2048×2048 — безпечний максимум для mobile. 4096×4096 підтримується на більшості сучасних Android/iOS пристроїв, але є виключення (старі бюджетні Android). Перевищення максимального розміру текстури для пристрою = краш або degraded fallback.
Анімаційні атласи. Спрайт-лист (всі кадри анімації в одному атласі) — стандарт для frame-by-frame анімацій. TexturePacker Sprite Sheet Export створює атлас + JSON/XML з координатами кожного кадру. Unity Sprite Editor читає цей JSON через Custom Physics Shape або через автоматичну нарізку по Sprite Editor.
Формати сжиття текстур
Формат зберігання текстури в атласі — критичний вибір для продуктивності:
| Платформа | Формат | Особливості |
|---|---|---|
| iOS | ASTC (4×4 або 6×6) | Найкраще якість/розмір для iOS A8+ |
| Android (сучасний) | ETC2 (RGB) / ETC2 RGBA | GLES 3.0+, підтримується 95%+ пристроїв |
| Android (legacy) | ETC1 + окремий альфа-канал | Для дуже старих пристроїв |
| PC/WebGL | DXT1 / DXT5 | Стандарт для desktop |
| Універсальний | RGBA32 | Без сжиття, максимальна якість, максимальний розмір |
RGBA32 для фінального продакшн-білда — помилка. 2048×2048 RGBA32 = 16МБ відеопам'яті. Та сама текстура в ASTC 4×4 = 2МБ. Різниця × кількість атласів у грі = проблема з пам'яттю на мобільних.
У Unity Platform-specific overrides в Texture Importer дозволяють задати різні формати для iOS та Android без дублювання ассетів.
Атлас у Unity: Sprite Atlas Asset
Unity Sprite Atlas (з Unity 2017+) — нативний інструмент без сторонніх плагінів. SpriteAtlas asset створюється в Project → Create → 2D → Sprite Atlas. Додаються папки або окремі спрайти в Objects for Packing. Unity автоматично пакує атлас при білді.
Важливий нюанс: спрайти повинні мати настройку Packing Tag або бути додані безпосередньо в Sprite Atlas — інакше вони пакуються як окремі текстури. Змішення атласних та неатласних спрайтів в одному UI Canvas — переривает draw call.
Late Binding (Unity 2020+): атлас завантажується тільки при першому використанні вміщеного в ньому спрайта, а не при старті сцени. Критично для великих ігор з безліччю атласів — знижує час завантаження початкової сцени.
Типові артефакти та їх причини
- Bleeding (пікселізація краю): padding = 0 або мипмапи без збільшеного padding
- Пусте місце в атласі (>20%): неоптимальний алгоритм упаковки або несумісні по розмірах спрайти
- Draw calls не знизились: спрайти з різних атласів в одному Canvas або рендер-батче
- Артефакти повороту: двигун не підтримує rotation, але TexturePacker включив його
Етапи роботи
- Аудит текущих ассетів — список всіх спрайтів, розміри, формати, наявність атласів
- Групування — розподіл спрайтів по атласам по правилу одного draw call
- Упаковка — TexturePacker з правильними параметрами під платформу
- Формат сжиття — настройка під iOS/Android/PC
- Інтеграція — імпорт у двигун, настройка Sprite Atlas, перевірка draw calls (Frame Debugger)
- Профілювання — до та після атласів, підтвердження зниження draw calls
| Масштаб | Строк |
|---|---|
| Аудит та реструктуризація атласів існуючого проекту | 2–5 днів |
| Створення повного сета атласів для нового проекту (до 500 спрайтів) | 1–2 тижні |
| Оптимізація + настройка платформених форматів + документація | 2–4 тижні |
Вартість визначається обсягом ассетів та кількістю підтримуваних платформ.





