Разработка системы освещения мобильной игры
Реальтайм освещение на мобильных устройствах — это постоянный торг. Один динамический Point Light в URP с тенями на Adreno 640 стоит около 1.5-2.5 мс на кадр. При целевых 60 FPS весь бюджет кадра — 16.6 мс, и два таких источника уже занимают треть бюджета только на свет. Мы перебирали десятки конфигураций, пока не нашли золотую середину: запекать всё, что не движется, и оставлять 1-2 реалтаймовых источника для игровых событий.
Стратегия освещения под мобильный GPU
Фундаментальный выбор — соотношение запечённого (baked) и динамического (realtime) света. Для большинства мобильных игр правило простое: всё статичное освещение запекаем, динамическое — минимум.
В Unity URP это: Mixed Lighting со Subtractive или Shadowmask режимом. Subtractive быстрее — тени от статики запекаются в lightmap, динамические объекты отбрасывают тень на статику через mixed light. Shadowmask точнее, но требует дополнительную текстуру на GPU.
Lightmap resolution — типичная ошибка завышения. Texels per unit = 20 для детальной геометрии и 4-8 для фонового окружения. Гигантский lightmap 2048×2048 за один атлас на всю локацию — хорошо. Двадцать мелких lightmap по 256×256 — плохо, это двадцать texture binds. Чтобы избежать этого, группируем статику в один атлас и повторно используем материалы.
Когда оправданы динамические источники?
Динамический свет нужен для игровых событий: взрыв, выстрел, интерактивные факелы. Реализация через короткоживущий Light с интерполяцией Range:
IEnumerator FlashLight(Light light, float intensity, float duration) { float elapsed = 0f; while (elapsed < duration) { light.intensity = Mathf.Lerp(intensity, 0f, elapsed / duration); elapsed += Time.deltaTime; yield return null; } light.enabled = false; } Такой вспышечный свет можно не включать в shadow casting — визуально разница минимальна, а производительность значительно лучше.
Ограничение количества Per-Object lights. В URP Light настройку Additional Lights > Per Object Limit выставляем в 1-2 для мобильных пресетов. По умолчанию 8 — это десктопное значение. Наш опыт: на Adreno 618 два реалтаймовых источника без теней дают 0.8 мс дополнительного времени.
Как работают Light Probes?
Персонажи и враги двигаются через запечённые зоны и должны получать правильное ambient-освещение. Light Probe Group расставляем в точках смены освещения: вход в тень, зона факела, темный коридор. LightProbeProxyVolume для крупных динамических объектов — заменяет интерполяцию между пробами на объёмную выборку.
Без Light Probes персонаж в тёмном углу светится, как будто стоит на солнце — ambient из Skybox применяется без учёта позиции.
Ambient Occlusion: мобильные альтернативы
Screen Space AO (SSAO) на мобиле — нет. Дорого и не нужно при правильных lightmap. Альтернативы:
- Запечённый AO в lightmap — бесплатно в рантайме, настраивается в
Generate Lightingнастройках. - Vertex AO — запекается в vertex color, сэмплируется в шейдере, полностью бесплатно.
- GTAO в URP 15+ — экспериментально, на топовых мобильных GPU допустимо при низком
radius.
Godot 4: освещение в 2D
В 2D-играх на Godot: CanvasItemMaterial с Light Mode = Normal Map Only позволяет использовать normal maps на спрайтах и получать псевдо-3D освещение без реального 3D. PointLight2D с Shadow Enabled = false стоит дёшево. DirectionalLight2D для имитации солнца в top-down играх.
Нормал-маппинг в 2D — мощный инструмент: игра выглядит объёмно, а рендерится как flat sprites. На мобиле это существенно выгоднее, чем переход в 3D ради визуальной глубины.
Как профилировать освещение?
Unity Frame Debugger показывает все draw calls по освещению. Xcode GPU Frame Capture на iOS даёт точный breakdown по шейдерным инвокациям. Цель: Shadow Map passes — не более 1-2 за кадр, Additional Lights — не более 2 реалтаймовых источника одновременно.
| Параметр | Целевое значение | Критическое значение |
|---|---|---|
| Shadow Map passes | ≤2 | >4 |
| Realtime lights per object | 1-2 | >4 |
| Lightmap atlas size | 2048×2048 | Множество мелких атласов |
| Additional Lights total | ≤4 | >8 |
Что входит в разработку системы освещения?
- Анализ сцен и целевых устройств — подбор стратегии (baked/realtime mix).
- Настройка lightmap resolution и атласирование — устранение перерасхода ресурсов.
- Расстановка Light Probes и настройка Proxy Volume.
- Оптимизация динамических источников: ограничение Per-Object Limit, кэширование корутин.
- Профилирование и фиксация — Frame Debugger, GPU Capture, Instruments.
- Итоговая документация по освещению для команды (конфиги, схемы, метрики).
Наш опыт: 10+ лет в мобильной разработке, 50+ проектов с оптимизацией под iOS/Android. Мы гарантируем, что система освещения будет работать в рамках бюджета 16.6 мс для 60 FPS на целевых устройствах. Свяжитесь с нами для консультации или расчёта стоимости под ваш проект.
Документация Unity URP: https://docs.unity3d.com/Manual/universal-render-pipeline.html
Типичные ошибки при настройке освещения
- Использование 4+ реалтаймовых источников на мобиле.
- Слишком высокое разрешение lightmap для фонового окружения.
- Забыли расставить Light Probes — динамические объекты выглядят плоскими.
- Всключение SSAO без тестирования производительности.







