Мы создаём спрайтовые атласы для 2D-игр — это даёт снижение draw calls в 3–10 раз на мобильных устройствах. Десять отдельных спрайтов в папке — десять текстурных биндингов при отрисовке. Те же десять спрайтов в одном атласе — один биндинг. На мобильном разница в производительности колоссальна. Наш опыт — 5+ лет в геймдеве и десятки проектов — подтверждает: правильный атлас сокращает время загрузки на 40% и экономит до 70% draw calls.
Но атлас — не просто «сложить текстуры в одну большую». Неправильно составленный атлас даёт артефакты, 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 (начиная с версии, поддерживающей Sprite Atlas) — нативный инструмент без сторонних плагинов. SpriteAtlas asset создаётся в Project → Create → 2D → Sprite Atlas. Добавляются папки или отдельные спрайты в Objects for Packing. Unity автоматически пакует атлас при билде.
Важный нюанс: спрайты должны иметь настройку Packing Tag или быть добавлены непосредственно в Sprite Atlas — иначе они пакуются как отдельные текстуры. Смешение атласных и неатласных спрайтов в одном UI Canvas — draw call разрывается.
Late Binding (современные версии Unity): атлас загружается только при первом использовании содержащегося в нём спрайта, а не при старте сцены. Критично для больших игр с многими атласами — снижает время загрузки начальной сцены.
Типичные артефакты и их причины
- 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 недели |
Стоимость рассчитывается индивидуально, исходя из объёма ассетов и числа платформ. Оценим ваш проект бесплатно. Свяжитесь для консультации.
2D-арт и анимация
Мы сталкивались с проектами, где 2D-графика занимала 70% места в сборке. Оптимизация начиналась с замены frame-by-frame на скелетную анимацию. Но важно не просто перевести спрайты в Spine — нужно правильно спроектировать риг, упаковку атласов и формат текстур. Наша услуга — полный цикл 2D: от концепт-арта и иллюстраций до финальной Spine-анимации с оптимизацией под мобильные платформы.
Мобильная игра с 200 анимациями персонажей занимает 800 МБ только на текстурах. APK отклоняет Google Play из‑за размера. При этом половина анимаций — вариации одного и того же движения с незначительными отличиями. Это классическая проблема команд, которые выбирали frame-by-frame анимацию там, где скелетная даёт лучший результат с долей размера.
Наша команда создаёт 2D-графику и иллюстрации для игр любых жанров — от пиксель-арта до реалистичных стилей. Мы работаем с Unity, Unreal Engine и Godot. Каждая анимация проверяется на производительность: FPS budget, количество draw calls, размер текстур.
Что входит в услугу
- Концепт-арт и иллюстрации — персонажи, окружение, UI-элементы, промо
- Спрайт-анимация — frame-by-frame в Aseprite с палитрой и оптимизацией кадров
- Скелетная анимация — Spine (профессиональная лицензия), DragonBones для бюджетных проектов
- 2D-эффекты — particle-based (Shuriken, VFX Graph) и шейдерные (Shader Graph для URP/HDRP)
- Оптимизация атласов — TexturePacker, Unity Sprite Atlas, сжатие под платформу (ASTC, ETC2, DXT)
Как скелетная анимация уменьшает размер APK?
Spine (Esoteric Software) — де‑факто стандарт скелетной анимации для 2D игр. Скелетная анимация — метод, при котором движение задаётся костями и весами вершин, а не целыми кадрами. В Spine анимация персонажа с 15 анимациями занимает ~2 МБ, frame-by-frame — 10 МБ (в 5 раз больше). Альтернативы — DragonBones (бесплатный, меньше функций) и нативный 2D Animation package в Unity (удобен, но слабее Spine по инструментам).
Окупаемость лицензии Spine Professional ($299) наступает при создании 15+ уникальных анимаций — каждая frame-by-frame стоила бы в 5 раз больше времени и размера. При масштабировании на 50 анимаций экономия на одном проекте превышает $10 000 на разработке и $2000 на трафике из-за уменьшения размера APK. Свяжитесь с нами — мы рассчитаем экономию для вашего проекта.
Когда скелетная анимация эффективнее покадровой?
| Критерий |
Скелетная (Spine) |
Frame-by-frame (Aseprite) |
| Размер данных |
Малый (кости + веса) |
Большой (кадры как изображения) |
| Гибкость блендинга |
Высокая |
Отсутствует |
| Выразительность |
Зависит от риггера |
Полная художественная свобода |
| Время производства |
Долгий ригинг, быстрые итерации |
Каждая анимация с нуля |
| Подходит для |
Персонажи, UI, существа |
Пиксель-арт, особый стиль |
Правило, которое работает на практике: если у персонажа более 15 уникальных анимаций — Spine экономичнее по размеру и времени итераций. Если проект стилистически требует frame-by-frame (пиксель-арт, ротоскопирование, мультипликационный стиль с умышленными артефактами) — Aseprite.
Mesh Deformation в Spine — одна из ключевых возможностей. Персонаж гнётся органично, одежда складывается, щёки надуваются. Workflow:
- В Spine создаём mesh на спрайте (Tools > Mesh > Edit Mesh)
- Назначаем веса вершин к костям (Weights mode)
- Устанавливаем количество вершин исходя из нужной детализации деформации — больше вершин = плавнее деформация, но выше вычислительная стоимость
Path Constraints — кость следует по кривой. Используется для хвостов, волос, щупалец, верёвок — любых элементов, которые должны изгибаться органично.
IK Constraints в Spine работают через двух- или трёхкостную цепочку. Для конечностей это обязательно: аниматор двигает IK target (позицию ладони), а цепочка плечо-предплечье-кисть выстраивается автоматически. Без IK анимировать конечности в FK — тратить вдвое больше времени.
Интеграция Spine в Unity
Официальный Spine-Unity runtime — платный (входит в лицензию Spine), активно поддерживается. Компоненты:
-
SkeletonAnimation — основной компонент для анимации
-
SkeletonMecanim — интеграция с Animator Controller Unity (удобно для переиспользования Mecanim-логики)
-
SkeletonGraphic — для Canvas/UI (рендерится через CanvasRenderer, не через MeshRenderer)
Важный момент производительности: SkeletonAnimation создаёт отдельный Mesh per instance. При 50+ персонажах на экране это 50 draw calls минимум (без батчинга). Решение — SkeletonAnimation Batching через SubmeshSeparator + GPU instancing, либо ограничение количества одновременно видимых Spine-объектов.
Spine Events — механизм синхронизации: событие в анимации (footstep, attack_hit, spawn_particle) диспатчится в Unity-код через AnimationState.Event. Правильная архитектура: Spine Event → UnityEvent → звук/партикл/логика. Не хардкодить синхронизацию по времени — анимация может замедляться через timeScale.
Как уменьшить draw calls в 2D UI с помощью атласов?
Каждый отдельный спрайт в Unity создаёт отдельный draw call. 100 UI-иконок без атласа = 100 draw calls только на UI. Sprite Atlas упаковывает спрайты в единую текстуру, позволяя батчить draw calls для объектов, использующих один атлас. Texture atlas — техника, применяемая в 3D и 2D для снижения числа переключений текстур.
TexturePacker vs Unity Sprite Atlas
TexturePacker (CodeAndWeb) — внешний инструмент, более гибкий в настройке упаковки. Поддерживает множество алгоритмов упаковки, trim прозрачных пикселей, extrude краёв для предотвращения bleeding, экспорт в специфичные форматы платформ (PVRTC для iOS, ETC2 для Android). Лицензия стоит $89 — окупается на первом проекте с атласами.
Unity Sprite Atlas (встроенный) — удобен для Addressables и динамической загрузки. Два режима: Master Atlas (полный контроль) и Variant Atlas (уменьшенная версия для low-end устройств через Scale Factor).
Практические правила упаковки:
- Группировать по сцене/экрану: всё, что видно одновременно — в одном атласе. Иначе atlas не помогает с батчингом
- Максимальный размер атласа: 2048x2048 для мобильных, 4096x4096 для PC. Больше — риск проблем на старых GPU
- Trim прозрачных пикселей: обязательно. Спрайт с большими прозрачными полями впустую занимает место в атласе
- Padding: 2-4 пикселя между спрайтами предотвращает texture bleeding при mipmapping и UV filtering
Форматы сжатия текстур
| Платформа |
Рекомендуемый формат |
Примечание |
| Android |
ETC2 (RGB) / ETC2 RGBA8 |
Аппаратное ускорение на всех современных Android |
| iOS |
ASTC 4x4 / 6x6 |
ASTC универсален: качество + размер |
| PC/Console |
DXT5 (BC3) |
Или BC7 для высокого качества |
| WebGL |
DXT5 + fallback |
Проверить поддержку через SystemInfo |
Для атласов с большим количеством мелких спрайтов и sharp краями — ASTC 4x4 предпочтительнее ASTC 6x6 (меньше артефактов на мелких деталях).
Что даёт оптимизация 2D-ассетов на практике?
Каждый из этих пунктов проверен на десятках проектов: trim прозрачных пикселей в атласе (экономия до 30% площади), padding 2–4 пикселя (устраняет bleeding), максимальный размер атласа 2048x2048 для мобильных (стабильная работа на старых GPU), использование ASTC 4x4 для iOS и ETC2 для Android, Mesh Deformation в Spine вместо лишних костей для щёк и складок одежды, группировка UI-элементов по экранам в разные атласы. Закажите разработку 2D-анимации с гарантией производительности — мы учтём все нюансы вашего стека и платформы.
Какой пайплайн для 2D-эффектов выбрать?
Particle System (Shuriken) — для большинства 2D-эффектов достаточно встроенного. Для 2D важно: Renderer Mode = Billboard или Horizontal Billboard, Simulation Space = World для эффектов, которые не должны двигаться с персонажем.
Visual Effect Graph (VFX Graph) в URP — GPU-based particles, подходит для сложных эффектов с тысячами частиц. Для мобильных — осторожно, требует Compute Shaders (не все устройства поддерживают).
Shader Graph для 2D: dissolve-эффекты, outline через SDF, distortion (water, heat shimmer), анимированные UV (лава, вода). Sprite Lit Shader + кастомные ноды в Shader Graph — стандартный путь для 2D в URP.
2D Animation Package (нативный Unity): PSDImporter для импорта слоёв из Photoshop как отдельных спрайтов, Sprite Skin для скелетной анимации внутри Unity без Spine. Подходит для простых персонажей с ограниченным количеством анимаций — если команда не хочет покупать лицензию Spine ($299 Professional, $2999 Enterprise). Эти затраты окупаются за один проект, если анимаций больше 15.
Мы готовы разработать 2D-графику и анимацию для вашей игры. Свяжитесь с нами, чтобы обсудить детали и получить консультацию по оптимизации ассетов. Получите прикидку стоимости и сроков на основе вашего ТЗ — мы ответим в течение рабочего дня.