Mobile Game Texture Atlas Optimization
Improperly packed textures are among the most common reasons a game takes 300 MB instead of 80 MB, and crashes on older Android with SIGKILL from OOM. Meanwhile, the editor runs fine: Unity stores textures uncompressed, real VRAM size becomes apparent only profiling on device.
Typical Atlas Problems
Default format—RGBA32. Without explicit Override per platform, Unity packs textures in uncompressed RGBA32. 1024×1024 in RGBA32—4 MB VRAM. Same data in ASTC 6×6—around 250 KB. With ten such textures, difference becomes significant.
Atlas size not power-of-two. GPU doesn't efficiently handle 700×900 textures. Unity warns, doesn't auto-fix. Non-power-of-two textures don't compress well and take more VRAM than nearest POT.
One atlas for everything. All sprites in single 4096×4096 atlas—16 MB just for one texture in RGBA32. Switching screens, entire atlas stays in memory even using 10% of sprites.
Transparency where unnecessary. JPEG can't handle transparent sprites, but PNG with fully opaque background packs as RGBA instead of RGB—extra channel pointless.
Compression Formats: What to Choose
| Platform | Format | Quality | Application |
|---|---|---|---|
| Android (most) | ASTC 6×6 | high | all textures |
| Android (legacy, API < 23) | ETC2 | medium | opaque; ETC2 RGB for alpha |
| iOS | ASTC 6×6 | high | all textures |
| iOS (fallback) | PVRTC | low | only extreme memory shortage |
ASTC—adaptive, supports any aspect ratio, available on all Android 5.0+ and iOS A8+. For game sprites, 6×6 gives quality/size balance. For UI with small text—4×4.
ETC2 on Android needed only for devices older than 2015. In 2024 rare, but if project data shows >5% such devices—account for it.
Atlas Structure by Context
Right strategy—split atlases by use context, not object type:
- ui-hud: HUD elements shown during gameplay constantly
- ui-menus: buttons, backgrounds, icons for menus (unloaded during gameplay)
- gameplay-player: player sprites and animations
- gameplay-enemies-tier1: tier-1 enemies
- gameplay-vfx: particles, explosions, effects
This split allows unloading unused atlases via Resources.UnloadUnusedAssets() or Addressables with explicit Release. Single all-game atlas makes this impossible.
Empty Space in Atlas
Unity SpriteAtlas leaves padding between sprites (default 4 px) preventing bleeding. On 1024×1024 atlas, this can waste 15–20% area. Reduce padding to 2 px for non-subpixel sprites, noticeably improves packing.
Check actual fill percentage in atlas Preview in Inspector. Below 70%—rethink breakdown.
Optimization Process
Start with Memory Profiler (Window → Analysis → Memory Profiler) on real device: look at Textures section, sort by size. Top-10 heaviest textures—80% of time uncompressed atlases or PNG without platform settings.
Next: set Overrides for Android/iOS in each atlas, restructure by use context, set Mip Maps (disable for 2D—saves 33% per texture), verify POT sizes.
Final check—Android GPU Inspector or Xcode Metal System Trace. Compare VRAM before/after.
Timeline: three-six workdays depending on atlas quantity and Addressables presence.







