Створення динамічних тіней, оптимізованих для мобільної графіки

Наша компанія з розробки відеоігор веде незалежні проекти, спільно з клієнтом створює ігри та надає додаткові операційні послуги. Досвід нашої команди дозволяє нам охопити всі ігрові платформи та розробити приголомшливий продукт, що відповідає баченню клієнта та перевагам гравців.

Від імерсивних застосунків до ігрових світів і 3D-сцен

Наша виділена команда для VR/AR/MR-розробки, Unity-продакшну і 3D-моделювання та анімації — з власними кейсами і презентаціями.

Відвідати персоналізований сайт
Показано 1 з 1 послугУсі 242 послуг
Створення динамічних тіней, оптимізованих для мобільної графіки
Складна
~1-2 тижні
Часті питання

Наші компетенції

Які етапи розробки гри?

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    685
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    866
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    492
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    534

Створення динамічних тіней, оптимізованих для мобільної графіки

На мобільному GPU Shadow Map при дозволі 2048×2048 без каскадів—прямий шлях до 18 мс на framebuffer лише на теневій pass. На Adreno 640 це з'їдає тепловий ліміт раніше, ніж відпрацює основна геометрія. Тіні на мобілі—не «налаштуйте та забудьте», а постійний балансинг між візуальною якістю та термалом.

Чому стандартні налаштування Unity Shadow Distance вбивають мобільну продуктивність

Найчастіша помилка—залишити Shadow Distance на значенні за замовчуванням (150 м) та тип тіней Hard Shadows у URP без каскадного розбиття. У результаті GPU малює теневу карту для всієї видимої геометрії, включаючи об'єкти на 80 метрах, які гравець ніколи не розглядатиме достатньо близько, щоб оцінити тінь.

Другий класичний кейс—використання Realtime GI з Enlighten на мобілі разом з динамічними тінями. Enlighten пересчитує lightmap при русі джерела світла, на Mali-G72 з 4 ядрами перетворюється на постійні drops до 24 FPS в моменти переходу між зонами освітлення. Рішення—перекладувати всі статичні об'єкти у Mixed Lighting з Subtractive Mode та залишати Realtime лише на персонажах.

Каскадні тіні (Cascade Shadow Maps) на мобілі також потребують обережності. Два каскади на дистанціях 8/40 м замість 10/30/60/150 м дають помітний приріст. Shadow Bias потрібно виставляти вручну під кожну сцену—автоматичне значення URP часто дає Peter Panning на плоских поверхнях саме через особливості 16-bit depth buffer на деяких пристроях.

Технічний стек та підходи

Працюємо в Unity URP (Universal Render Pipeline) з Custom Renderer Feature для тіней. Основні інструменти—Frame Debugger для аналізу теневих pass-ів, GPU Profiler у Unity Profiler з Rendering module, та Snapdragon Profiler / Mali Graphics Debugger для захоплення реальних даних з пристрою.

Процес починається з захоплення baseline: FPS, GPU time, кількість Shadow Caster Draw Calls. На типовому проекті з 300+ об'єктами в сцені Shadow Caster Pass дає 180–220 draw calls—вже половина рекомендованого бюджету для мобайла (400 всього).

Подальша робота:

  • Перекладуємо дрібні статичні об'єкти (камені, бордюри, декор) у Shadow Static—потрапляють у статичний Shadow Atlas та не перерисовуються щоразу
  • Для персонажів та динамічних об'єктів використовуємо Screen Space Shadows замість Shadow Map там, де глибина сцени дозволяє (працює на Vulkan/Metal)
  • Налаштовуємо Shadow Fade Distance з плавним переходом на Blob Shadow (проектована текстурна тінь) за межами 15 м—візуально непомітно, вартість мінімальна
  • На tile-based GPU (Adreno, Mali) включаємо Early-Z Culling через правильну сортування Render Queue: непрозора геометрія спочатку, прозора—в кінці

Для VR-проектів на Quest 2/3—окрема історія з Multiview Rendering (single-pass stereo), Shadow Map рендерить один раз для обох очей. Але якщо в сцені є Shadow Casting об'єкти з різними Culling Mask для лівого/правого ока, Shadow Pass рвається на два незалежних—одразу +8–12 мс. Це баг-ловушка, яку не видно в Editor.

Як будується робота над проектом

Аудит сцени. Збираємо дані з цільового пристрою через ADB + Unity Profiler: Shadow Caster Count, GPU Shadow Pass Time, тепловий троттлинг за 5 хвилин навантаження.

Технічне завдання. По результатам аудиту визначаємо, що можна перекласти у Baked, що залишити Mixed, який Shadow Distance реалістичний для геймплею конкретного проекту.

Реалізація. Налаштування URP Asset, Renderer Feature, Culling Groups для LOD тіней, написання кастомного Shadow Caster Pass якщо стандартний не покриває потреби (наприклад, для рослинності з Alpha Cutout).

Тестування на залізі. Прогоняємо на мінімум трьох пристроях з таргетної матриці: low-end (Snapdragon 665), mid (Snapdragon 778G), high-end (Snapdragon 8 Gen 2). Thermal throttling тест—15 хвилин неперервної ігрової сесії.

Профілювання та фінальна ітерація. Порівнюємо з baseline, при необхідності—додатковий проход по Blob Shadow fallback.

Масштаб задачі Орієнтовні строки
Аудит + базова налаштування URP (1 сцена) 2–4 дня
Повна оптимізація тіней (3–5 сцен) 1–2 тижні
VR-проект з Multiview + кастомний Renderer Feature 2–4 тижні

Вартість розраховується індивідуально після аудиту проекту та аналізу вимог.

Типові помилки, які ми бачимо в проектах:

  • Не виставлений Render Shadow Maps per-object—всі об'єкти рендерять Shadow Map незалежно від дистанції до камери, хоча дальні об'єкти можна видалити через ShadowCastingMode.Off на рівні LOD2
  • Використання Light.shadowCustomResolution = 4096 у скрипті без перевірки SystemInfo.graphicsMemorySize—на бюджетних телефонах з 2 ГБ RAM це гарантований краш при низькій пам'яті
  • Змішення MSAA x4 з Dynamic Shadows на одному Render Target на старих Mali—драйвер переходить у software fallback, FPS падає у 2–3 рази. На ці пристрої потрібно примусово обмежувати MSAA x2 або відключати через QualitySettings.antiAliasing