Implementing LOD System for Mobile Games
A character with 80,000 polygons 2 meters from the camera looks great. The same character 50 meters away occupies 40×60 pixels on screen—yet GPU still renders 80,000 polygons. LOD (Level of Detail) is a core tool for managing GPU budget in mobile games. Properly configured LOD is transparent to players and visible in profilers.
LOD in Unity (URP/Built-in)
Unity LOD Group—basic component. Add LOD Group to object, assign mesh renderers for each level:
| Level | Screen Space % | Polygons | Purpose |
|---|---|---|---|
| LOD 0 | >30% | 80,000 | Close-up, cutscenes |
| LOD 1 | 15–30% | 20,000 | Active mid-distance NPC |
| LOD 2 | 5–15% | 5,000 | Background characters |
| LOD 3 | 1–5% | 800 | Distant objects |
| Culled | <1% | — | Object not rendered |
Key parameter: LOD Bias in QualitySettings. On mobile—0.5–0.7 vs 1.0 on PC. This shifts LOD transitions closer to camera:
// Set depending on device performance
QualitySettings.lodBias = SystemInfo.graphicsMemorySize > 4096 ? 0.75f : 0.5f;
Cross-fade Transitions
Hard LOD switching is visible—"popping". LOD Group → Fade Mode → Cross Fade enables smooth transitions via dither. Costs GPU time—use only for LOD 0→1 (most noticeable), for LOD 2→3 popping is imperceptible.
lodGroup.fadeMode = LODFadeMode.CrossFade;
lodGroup.animateCrossFading = true;
In URP, add #pragma multi_compile _ LOD_FADE_CROSSFADE and UNITY_APPLY_DITHER_CROSSFADE(i.pos) to shader.
LOD in Unreal Engine Mobile
StaticMeshComponent and SkeletalMeshComponent support LOD out of box. Configure in Static Mesh Editor: LOD Settings tab.
Auto LOD generation (Unreal 4.20+):
// In Static Mesh Editor → LOD Settings
Number of LODs: 4
LOD 1: Reduction Settings → Triangle Percent = 50%
LOD 2: Triangle Percent = 20%
LOD 3: Triangle Percent = 8%
For mobile projects: r.StaticMeshLODDistanceScale 0.5 in DefaultEngine.ini → LOD transitions happen twice closer to camera.
Skeletal Mesh LOD—separate story. Bones invisible at distance are removed from LOD 2+. LOD Reduction Settings → Remove Bones Below—cut fingers, facial details for LOD 2+.
HLOD (Hierarchical LOD)
For open worlds with many objects—HLOD merges multiple static meshes into one proxy mesh at distance. In Unity—HLOD System package (com.unity.hlod). In Unreal—built into World Settings → HLOD.
Principle: 100 separate trees at 200m distance combine into one mesh with one draw call. 100 draw calls → 1 for entire cluster.
Case: Open World on Galaxy A34
Isometric RPG: entering town (400+ objects) FPS dropped 60 to 22. Draw calls: 680 per frame. Static without LOD, no batching.
Optimization steps:
- LOD Group on all buildings and trees—4 levels, Culled at 2% screen space
- Static Batching for LOD-less objects (stones, barrels)—draw calls 680 → 220
- HLOD for far town quarters—proxy mesh with 15K polygons instead of 400 objects
- LOD Bias 0.6 for Android in Quality Settings
Result: 22 FPS → 54 FPS in same area.
Programmatic LOD for UI Elements
LOD applies beyond 3D geometry. Particles, UI, shadows also need detail levels.
Particle System LOD (Unity): Particle System → LOD Level—reduce Max Particles and emission rate for distant particles. Explosion 100m away needs 10 particles not 200.
Shadow Distance: shadows are expensive. On mobile—Shadow Distance = 30–50 meters vs standard 150:
QualitySettings.shadowDistance = 40f; // meters from camera
QualitySettings.shadowCascades = 2; // 2 cascades not 4
LOD Verification Tools
Unity LOD Group Visualizer (Scene View → Debug Mode → LOD)—shows current active LOD colored. Green = LOD 0, yellow = LOD 1, red = LOD 2+.
// Programmatic LOD check at runtime
var lodGroup = GetComponent<LODGroup>();
var lods = lodGroup.GetLODs();
// Use Camera.CalculateLODDistanceFactor for pre-calculation
Timeline
Setting up LOD for 20–30 objects—2–3 days. Full LOD system for mobile game with HLOD—1–2 weeks.







