Free Ebook cover Mobile Game Development Essentials: Controls, Performance, and Publishing Readiness

Mobile Game Development Essentials: Controls, Performance, and Publishing Readiness

New course

10 pages

Asset Optimization for Mobile Games: Size, Memory, and Quality Trade-offs

Capítulo 6

Estimated reading time: 12 minutes

+ Exercise

Why Asset Optimization Matters (and What You’re Optimizing)

On mobile, assets are often the largest contributor to: (a) app download size, (b) install size, (c) runtime memory (especially GPU texture memory), and (d) rendering/decoding cost. “Optimization” is not only making things smaller—it is choosing where quality is visible and where it is wasted. The goal is to ship assets that match device constraints while preserving the player’s perceived quality.

Think in three budgets for every asset:

  • Size on disk: affects download/install and patch sizes.
  • Memory footprint: what must be resident in RAM/VRAM to render or play.
  • Runtime cost: GPU fill/overdraw, CPU skinning, audio decode, streaming stalls, etc.

1) Texture Strategy

1.1 Resolution tiers: plan for multiple device classes

Instead of authoring “one size fits all,” define resolution tiers for textures. A tier is a set of maximum texture sizes and/or a scale factor applied at import/build time.

TierTypical targetMax world textureMax UI textureNotes
LowOlder/low-memory devices512–10241024–2048Prefer fewer unique textures; aggressive compression.
MidMainstream1024–20482048Balanced; keep UI crisp where needed.
HighHigh-end2048–40962048–4096Only if visual gain is obvious; watch memory spikes.

Practical steps:

  • List texture categories: UI, characters, environment, VFX, decals, fonts/sprites.
  • Assign each category a tier cap (e.g., environment ≤ 1024 on Low, characters ≤ 2048 on Mid).
  • Ensure the build pipeline can downscale per tier (import settings or build-time processing).
  • Validate on device: check for blurriness in UI and shimmering in world textures; adjust caps per category.

1.2 Compression families (conceptual): choose the right “kind” of compression

Mobile GPUs support different texture compression formats. You don’t need to memorize every acronym to make good decisions; treat them as families with trade-offs:

Continue in our app.

You can listen to the audiobook with the screen off, receive a free certificate for this course, and also have access to 5,000 other free online courses.

Or continue reading below...
Download App

Download the app

  • Block-compressed color: good for opaque/albedo textures; small in memory and fast on GPU; can show block artifacts on smooth gradients.
  • Block-compressed with alpha: supports transparency; often larger than opaque; alpha can introduce visible artifacts on UI edges.
  • High-quality universal: better quality at similar sizes but may cost more to encode at build time; good default when available.
  • Uncompressed: highest quality but huge memory; reserve for tiny textures or cases where compression artifacts are unacceptable (rare).

Decision rule: start with GPU-native compression for everything, then selectively override only the textures where artifacts are visible in gameplay (not in zoomed-in inspection).

1.3 Mipmaps: when they help and when they waste memory

Mipmaps are precomputed smaller versions of a texture used when the texture is far from the camera. They reduce shimmering and improve sampling performance, but they add memory (roughly +33% for a full mip chain).

Use mipmaps for:

  • World textures seen at varying distances (terrain, props, characters).
  • Any texture that can appear small on screen due to camera distance or perspective.

Avoid mipmaps for:

  • UI textures that are always rendered at (roughly) constant pixel size.
  • Sprites that are never minified (e.g., fixed-size HUD icons).

Practical steps:

  • Enable mipmaps on world textures by default.
  • Disable mipmaps on UI atlases unless the UI is frequently scaled down.
  • If you see shimmering/moire on distant surfaces, verify mipmaps exist and consider anisotropic filtering for surfaces viewed at grazing angles (use sparingly).

1.4 Atlasing: fewer texture binds vs bigger textures

Texture atlases pack many images into one texture to reduce draw calls and state changes. This is especially useful for UI and 2D sprites. However, atlases can increase memory if they force large textures to stay resident, and they can cause mipmap bleeding if not padded.

UI vs world atlasing:

  • UI atlases: usually a win. UI elements share materials, and you want stable batching.
  • World atlases: situational. Atlasing can help for many small props, but large atlases can waste memory if only a few sub-images are visible in a scene.

Practical steps for safe atlases:

  • Group by: same shader/material settings, same compression needs, same update frequency.
  • Add padding between sprites (to prevent mip bleeding). A common starting point is 4–8 pixels padding, more if heavy minification occurs.
  • Keep atlas sizes within tier caps (don’t create a 4096 atlas if Low tier can’t afford it).
  • Prefer multiple smaller atlases over one giant atlas when only subsets are used per scene.

1.5 UI textures vs world textures: different quality priorities

UI textures are judged at close range and often contain text-like edges, icons, and flat colors. World textures are judged in motion and at varying distances.

  • UI: prioritize crisp edges, avoid compression artifacts on gradients, keep alpha clean. Consider higher resolution but limited count.
  • World: prioritize consistent texel density and good mip behavior; accept mild compression artifacts if they are not noticeable during play.

Step-by-step: set a texel density target:

  • Pick a target like 256–512 texels per meter for hero assets and lower for background props.
  • For each model, estimate its on-screen importance and assign a texture size that matches the density.
  • Downscale textures that exceed the density without visible gain.

2) 3D Model Strategy

2.1 Poly budgets: allocate triangles where silhouette matters

Triangle count affects vertex processing, skinning, and sometimes bandwidth. The best savings come from removing triangles that do not change the silhouette or shading in motion.

Practical steps:

  • Define budgets per asset class (example: hero character, enemy, prop, environment chunk).
  • Spend triangles on silhouette (outer contour) and deformation areas (joints) rather than flat interior surfaces.
  • Remove hidden faces (inside meshes, under armor, beneath terrain).
  • Prefer consistent topology for deforming characters to avoid shading artifacts when simplified.

2.2 LODs: reduce cost with distance (and sometimes with screen size)

Level of Detail (LOD) swaps a high-detail mesh for simpler versions as the object becomes smaller on screen. LODs reduce vertex cost and can also reduce overdraw if they simplify alpha-heavy geometry (like foliage cards).

Step-by-step LOD setup:

  • Create LOD0 (highest), LOD1 (~50–60% triangles), LOD2 (~20–30%), and optionally a billboard/impostor for far distances.
  • Ensure UVs and materials remain consistent across LODs to avoid extra material variants.
  • Set transition thresholds based on screen coverage (preferred) rather than raw distance, so it scales across devices and FOVs.
  • Test transitions in motion; if popping is noticeable, adjust thresholds or add cross-fade if supported.

2.3 Normal maps vs geometry: when to fake detail

Normal maps can replace small-scale geometric detail (bolts, panel lines, wrinkles) at a fraction of the vertex cost, but they add texture memory and can look wrong at grazing angles or when the silhouette should change.

  • Use geometry for: silhouette changes, large forms, edges that catch highlights, and deformation-critical shapes.
  • Use normal maps for: fine surface detail that doesn’t affect silhouette.

Practical steps:

  • Identify which details are visible in the silhouette at typical camera distances; keep those as geometry.
  • Bake normal maps from a high-poly sculpt to a low-poly mesh for surface detail.
  • Consider smaller normal maps for background assets; normal maps are often over-allocated.

2.4 Materials and batching implications: fewer variants, fewer state changes

Even with low triangle counts, too many materials can increase draw calls and reduce batching. Each unique material/shader variant can force a separate render pass.

Practical steps:

  • Limit the number of materials per model (aim for 1 for props, 1–2 for characters when possible).
  • Reuse shared materials across many objects; vary appearance via textures or small parameter changes that do not break batching (engine-dependent).
  • Avoid unique shaders per asset; prefer a small set of standardized shaders (opaque, cutout, transparent, UI).
  • Be cautious with transparency: it often breaks batching and increases overdraw.

3) Audio Strategy

3.1 Streaming vs fully loaded: choose based on duration and latency needs

Audio can be stored compressed on disk and either decoded into memory (fully loaded) or decoded on the fly (streaming). The right choice depends on clip length and how quickly it must play.

  • Fully loaded: best for short sound effects that must play instantly (UI clicks, gunshots). Costs RAM.
  • Streaming: best for long tracks (music, ambience beds). Saves RAM but can cost CPU and risk stutter if I/O is stressed.

Practical steps:

  • Classify clips: SFX short (<2–3s), SFX long, music, ambient loops, voice.
  • Set default: short SFX = fully loaded; music/ambience = streaming.
  • For long but latency-sensitive clips (e.g., voice lines triggered by gameplay), consider preloading a small buffer or using “compressed in memory” modes if available.

3.2 Compression: trade size for decode cost and artifacts

Audio compression reduces download size and memory, but higher compression can introduce artifacts (swishy highs, warbling) and may increase decode cost. Use higher quality where the player focuses (music, voice) and lower quality for noisy SFX that mask artifacts.

Practical steps:

  • Start with a moderate bitrate/quality setting for each category.
  • Listen on phone speakers and cheap earbuds (common player hardware).
  • Lower quality for masked sounds (explosions, impacts) until artifacts become noticeable.
  • Keep voice intelligibility as a priority; artifacts are more noticeable on speech.

3.3 Sample rates: don’t pay for frequencies you can’t hear (or can’t reproduce)

Higher sample rates increase size and decode cost. Many mobile playback scenarios do not benefit from very high sample rates.

  • Music/voice: often fine at 44.1 kHz; sometimes 48 kHz depending on pipeline.
  • Most SFX: can often be reduced to 22.05 kHz (or similar) without noticeable loss, especially for effects with limited high-frequency content.

Step-by-step: downsample safely:

  • Identify SFX that are bandwidth-limited (thuds, footsteps, UI blips).
  • Downsample one candidate (e.g., 44.1 kHz → 22.05 kHz) and A/B test in-game.
  • If the sound becomes dull or loses clarity, keep a higher rate for that clip category.
  • Standardize rates per category to simplify the pipeline.

4) Animation / FX Strategy

4.1 Animation data: reduce bones, curves, and update work

Animation costs come from skeleton complexity (bones), skinning, and the amount of animation data (keyframes/curves). Mobile-friendly rigs focus on what the camera actually sees.

Practical steps:

  • Set a bone budget per character type; remove helper bones that do not affect silhouette.
  • Use fewer influences per vertex if your engine allows (e.g., 2–4 instead of 4–8).
  • Compress animation curves and reduce keyframes where motion remains smooth.
  • Prefer reusing animation clips across characters with compatible rigs.

4.2 Particle counts: fewer particles, smarter particles

Particles can be expensive due to overdraw (many transparent pixels) and per-particle updates. The visual goal is often “readability” rather than raw quantity.

Practical steps:

  • Start with a low particle count and increase only until the effect reads clearly at gameplay camera distance.
  • Use larger particles with soft edges instead of many tiny particles.
  • Limit lifetime and spawn rate; avoid continuous high-rate emitters unless essential.
  • Prefer GPU-friendly particle modes if available; avoid heavy per-particle CPU logic.

4.3 Overdraw: the hidden cost of transparent FX

Overdraw happens when the GPU shades the same pixel multiple times (common with transparency, smoke, glows). On mobile, overdraw can dominate frame time even when geometry is simple.

Practical steps:

  • Avoid stacking multiple full-screen transparent layers (fog + bloom sprites + smoke).
  • Keep particle systems tight to the visible area; don’t spawn large quads that cover the screen.
  • Use cutout/alpha-test where acceptable (harder edges) to reduce blended overdraw.
  • Reduce resolution/complexity of large-screen effects (e.g., fewer, larger sprites).

4.4 Baked vs real-time: precompute what doesn’t need to change

Some effects can be baked into textures or flipbooks (sprite sheets) instead of simulated in real time. This shifts cost from runtime computation to texture memory and bandwidth.

  • Bake: complex smoke, fire, magical swirls, explosions that repeat or can be reused.
  • Real-time: effects that must react dynamically (directional hits, gameplay-driven trails).

Step-by-step: converting a complex effect to a flipbook:

  • Simulate/render the effect offline at a suitable resolution (match tier caps).
  • Pack frames into a flipbook texture (atlas) with padding.
  • Play it in-engine as an animated material on a small number of quads.
  • Test memory: flipbooks can become large; reduce frame count or resolution if needed.

5) Asset Acceptance Rubric (Memory, Runtime, Visual Impact)

Use a consistent rubric so every asset is evaluated the same way. The point is to make trade-offs explicit and repeatable, not subjective.

5.1 The three-axis score

For each asset, score:

  • Memory cost: how much RAM/VRAM must be resident (textures, meshes, animation buffers, audio buffers).
  • Runtime cost: how expensive it is per frame or per use (draw calls, overdraw, skinning, decode/streaming).
  • Visual impact: how noticeable it is to the player during normal gameplay (screen time, size on screen, importance to readability).

Use a simple 1–5 scale (1 = low, 5 = high). Then decide actions based on the combination.

5.2 Asset acceptance table (fill this for every new asset)

AssetTypeTier caps applied?Memory cost (1–5)Runtime cost (1–5)Visual impact (1–5)DecisionNotes / Next step
Example: Hero_AlbedoTextureYes425AcceptKeep higher res on Mid/High; verify compression artifacts on skin gradients.
Example: SmokeBurstVFXYes353ReviseReduce overdraw: fewer quads, shorter lifetime, consider flipbook.
Example: AmbientTrack_01AudioN/A134AcceptStream; confirm no stutter during scene loads.

5.3 Decision rules (make trade-offs explicit)

  • High memory + low impact → downscale, compress harder, atlas differently, or remove.
  • High runtime + medium/low impact → simplify shader/material, reduce transparency/overdraw, add LODs, bake effects.
  • High impact + high cost → keep quality but optimize elsewhere: reduce unique variants, ensure correct compression, limit on-screen instances, add tier-specific versions.
  • Low cost + high impact → prioritize; these are “cheap wins” worth keeping.

5.4 Step-by-step acceptance workflow

  1. Classify the asset (UI texture, world texture, hero prop, background prop, SFX, music, VFX, character animation).
  2. Apply defaults for that class (tier cap, compression family, mipmaps on/off, streaming mode, LOD count).
  3. Estimate memory: texture resolution + format; mesh vertex/triangle count; animation bones/curves; audio length + load mode.
  4. Estimate runtime: transparency/overdraw risk, draw-call/material count, skinning complexity, streaming/decode needs.
  5. Score impact based on gameplay camera distance, frequency, and whether it affects readability (targets, hazards, UI clarity).
  6. Decide: Accept, Revise, or Reject. If Revise, write one concrete change (e.g., “LOD1 at 60%, disable mipmaps for UI atlas, downsample SFX to 22 kHz”).
  7. Verify in context: test in the actual scene and camera, not in isolation.

Now answer the exercise about the content:

A new game asset looks great in a close-up preview, but during normal gameplay its compression artifacts are not noticeable. According to the recommended decision rule, what should you do first?

You are right! Congratulations, now go to the next page

You missed! Try again.

The guidance is to start with GPU-native compression for everything and only change settings when artifacts are visible in normal gameplay, not in zoomed-in inspection.

Next chapter

Networking and Offline-Friendly Design for Mobile Games

Arrow Right Icon
Download the app to earn free Certification and listen to the courses in the background, even with the screen off.