Реалізація LOD-системи для мобільної гри
Персонаж з 80 000 полігонів в 2 метрах від камери виглядає чудово. Той же персонаж у 50 метрах займає 40×60 пікселів на екрані — й GPU все рівно рендерить 80 000 полігонів. LOD (Level of Detail) — один з основних інструментів управління GPU-бюджетом у мобільних іграх. Правильно настроєна LOD-система прозора для гравців та помітна в профайлері.
LOD у Unity (URP/Built-in)
Unity LOD Group — базовий компонент. Додаємо LOD Group до об'єкта, призначаємо mesh-рендереру для кожного рівня:
| Рівень | Screen Space % | Полігонів | Призначення |
|---|---|---|---|
| LOD 0 | >30% | 80 000 | Крупний план, кат-сцени |
| LOD 1 | 15–30% | 20 000 | Активні NPC середньої дистанції |
| LOD 2 | 5–15% | 5 000 | Фонові персонажі |
| LOD 3 | 1–5% | 800 | Дальні об'єкти |
| Culled | <1% | — | Об'єкт не рендериться |
Ключовий параметр: LOD Bias в QualitySettings. На мобільних платформах — 0.5–0.7 проти 1.0 на PC. Це зміщує переходи між LOD-рівнями ближче до камери:
// Встановлюємо залежно від продуктивності пристрою
QualitySettings.lodBias = SystemInfo.graphicsMemorySize > 4096 ? 0.75f : 0.5f;
Cross-fade переходи
Різке переключення між LOD помітно — «поппінг». LOD Group → Fade Mode → Cross Fade включає плавний переход через dither. Стоїть GPU-часу — використовуємо лише для LOD 0→1 (найпомітніший переход), для LOD 2→3 поппінг непомітний.
lodGroup.fadeMode = LODFadeMode.CrossFade;
lodGroup.animateCrossFading = true;
На URP додаємо у шейдер #pragma multi_compile _ LOD_FADE_CROSSFADE та UNITY_APPLY_DITHER_CROSSFADE(i.pos).
LOD у Unreal Engine Mobile
StaticMeshComponent та SkeletalMeshComponent підтримують LOD з коробки. Настройка в Static Mesh Editor: вкладка LOD Settings.
Auto LOD generation (Unreal 4.20+):
// У 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%
Для мобільних проектів: r.StaticMeshLODDistanceScale 0.5 в DefaultEngine.ini → LOD переходи відбуваються вдвоє ближче до камери.
Skeletal Mesh LOD — окрема історія. Кості, які не видні на дистанції, видаляємо з LOD 2+. LOD Reduction Settings → Remove Bones Below — видаляємо пальці, дрібні кості обличчя для LOD 2+.
HLOD (Hierarchical LOD)
Для відкритих світів з великою кількістю об'єктів — HLOD об'єднує кілька static mesh в один proxy mesh на дальніх дистанціях. У Unity — пакет HLOD System (com.unity.hlod). У Unreal — вбудований в World Settings → HLOD.
Принцип: 100 окремих дерев на дистанції 200м об'єднуються в один mesh з одним draw call. З 100 draw calls → 1 draw call для цілого кластера.
Кейс: open world на Galaxy A34
Ізометрична RPG: при входженні в місто (400+ об'єктів) FPS проседав з 60 до 22. Draw calls: 680 у кадрі. Статика без LOD, без batching.
Кроки оптимізації:
- LOD Group на всі будівлі та дерева — 4 рівні, Culled на 2% screen space
- Static Batching для об'єктів без LOD (камені, бочки) — draw calls 680 → 220
- HLOD для дальніх кварталів міста — proxy mesh з 15K полігонів замість 400 об'єктів
- LOD Bias 0.6 для Android у Quality Settings
Результат: 22 FPS → 54 FPS у тому ж районі карти.
Програмний LOD для UI-елементів
LOD застосовується не лише до 3D-геометрії. Частиці, UI, тені — також потребують рівнів деталізації.
Particle System LOD (Unity): Particle System → LOD Level — зменшуємо Max Particles та emission rate для дальніх частиць. Взрив у 100 метрах — достатньо 10 частиць замість 200.
Shadow Distance: тені дорогі. На мобілі — Shadow Distance = 30–50 meters замість стандартних 150:
QualitySettings.shadowDistance = 40f; // метри від камери
QualitySettings.shadowCascades = 2; // 2 каскади замість 4
Інструменти верифікації LOD
Unity LOD Group Visualizer (Scene View → Debug Mode → LOD) — показує кольором поточний активний LOD для кожного об'єкта. Зелений = LOD 0, жовтий = LOD 1, червоний = LOD 2+.
// Програмна перевірка поточного LOD у runtime
var lodGroup = GetComponent<LODGroup>();
var lods = lodGroup.GetLODs();
// Використовуємо Camera.CalculateLODDistanceFactor для попередження розрахунку
Терміни
Настройка LOD для 20–30 об'єктів — 2–3 дні. Повна LOD-система для мобільної гри з HLOD — 1–2 тижні.







