Реализация 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 transitions
Резкое переключение между 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 package (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 недели.







