Разработка системы освещения мобильной игры
Реальтайм освещение на мобильных устройствах — это постоянный торг. Один динамический Point Light в URP с тенями на Adreno 640 стоит около 1.5-2.5 мс на кадр. При целевых 60 FPS весь бюджет кадра — 16.6 мс, и два таких источника уже занимают треть бюджета только на свет.
Стратегия освещения под мобильный 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 interpolation:
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 — это десктопное значение.
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 реалтаймовых источника одновременно.
Разработка системы освещения: 3-7 дней для типичного мобильного проекта. Стоимость рассчитывается индивидуально после оценки сцен и целевых устройств.







