Создание атласов 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 недели |
Стоимость определяется объёмом ассетов и количеством поддерживаемых платформ.





