Texture Atlas Optimization for Mobile Games
Sprite Atlas in Unity is an understandable tool, but improper setup consistently adds 40–100 MB to mobile app memory and kills batching where expected. Typical mistake: developer enabled Sprite Atlas, combined all UI sprites into one atlas, satisfied — Draw Calls dropped from 80 to 12. But forgot to enable Include in Build in atlas settings. Result: atlas generated in Edit Mode, but in Release build each sprite loads as separate texture.
Or another story: atlas configured correctly, batching works, but atlas size 2048×2048 RGBA32 — that's 16 MB per texture without mipmaps. On device with 2 GB RAM, total UI atlas from 4 sheets consumes 64 MB. When switching languages (different character sets) — all 4 sheets in memory simultaneously.
Compression formats — most loss happens here
This is most underrated part of texture optimization. Developers often leave RGBA32 or RGBA16 for all textures without thinking.
ASTC — standard for modern mobile (iOS A7+, Android 2015+). Supports block compression with adjustable quality: ASTC 4×4 gives high quality at 8 bpp, ASTC 8×8 — acceptable quality at 2 bpp. For UI atlases use ASTC 4×4 or 6×6. For background textures without fine detail — ASTC 8×8.
ETC2 — fallback for Android without ASTC support. Supports alpha channel (unlike ETC1). Still relevant for old projects with minimum Android API level = 19.
PVRTC — formats for iOS (PowerVR GPU). Requires square textures with side in powers of two. If atlas 1024×512 — can't apply PVRTC without resizing.
Real case: casual puzzle game, Android+iOS. UI atlases occupied 128 MB in memory (RGBA32, 4 sheets 2048×2048). After switching to ASTC 6×6 for iOS and ETC2 for Android: 128 MB → 22 MB. On-screen quality — indistinguishable. UI scene load time dropped from 1.8s to 0.4s.
Atlas splitting strategy
Not all sprites in one atlas — path to problems. Right strategy:
Split by scene/screen. Sprites used only in menu — menu_atlas. Gameplay sprites — gameplay_atlas. Common elements (buttons, frames, icons) — common_atlas. Allows unloading unused atlases when switching scenes.
Atlases by usage frequency. Hotpath sprites (HP-bar, crosshair, timer) always in memory → core_hud_atlas. Rare screens (settings, shop) — unload via Addressables on screen close.
Atlas size limit. 2048×2048 — maximum for mobile. Some Android 4.4 devices don't support 4096×4096 for compressed formats. In Sprite Atlas Settings set Max Texture Size = 2048.
Duplicates in multiple atlases. Unity Addressables Analyze → Check Duplicate Bundle Dependencies detects sprites in multiple atlases. Means one sprite loaded into memory twice. Typical cause: shared sprite (currency icon) used in both menu and gameplay without explicit atlas specification.
Mipmaps for mobile atlases
For UI atlases disable mipmaps. UI renders in Screen Space, objects don't move from camera — mipmaps useless and increase texture size by 33%. In Texture Import Settings: Generate Mipmaps = false.
For game textures (3D objects, 2D background with scaling) — mipmaps mandatory. Without them aliasing and excessive texture fetch bandwidth.
Atlasing workflow in project
Use Sprite Atlas V2 (Legacy V1 outdated, but found in old projects). V2 supports Work with Packages and works correctly with Addressables.
Settings for mobile project:
- Pack on Play Mode = Always Enabled (correct Preview in Editor)
- Allow Rotation = true (tighter packing)
- Tight Packing = true (less empty space)
- Padding = 4 (prevents texture bleeding with ASTC)
| Task scale | Estimated timeline |
|---|---|
| Atlas audit + recommendations report | 1–2 days |
| Rework atlas strategy (1 platform) | 3–7 days |
| Full texture optimization for Android + iOS | 2–4 weeks |
| Addressables integration + memory management | 2–3 weeks |
Cost calculated individually after asset audit and target platforms.





