Як оптимізувати 2D світло в Unity

pic

Привіт! Як ти, ймовірно, вже знаєш, Unity створила пакет 2D Lights, який згодом став частиною пакету URP.

Не так давно я випустив гру — Dad’s Coming — використовуючи цю функцію. Коли ми почали розробку, пакет ще був у стадії попереднього перегляду, тому ми змогли побачити багато оновлень.

Іду прямо до суті: виглядає прекрасно. Продуктивність жахлива.

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

Перед оптимізацією — більше 90% всього часу ЦП витрачалося на рендеринг світла і тіней. Ми робили тести на Switch, і він ледве досягав 20 кадрів в секунду на деяких етапах.

Ось кілька порад, як оптимізувати використання цієї функції:

Мінімізуй світло з увімкненими тінями

  • Вмикай тіні тільки на тому світлі, де вони необхідні.

Світло без тіней дуже легке для системи. Світло з тінями — ні, навіть якщо це світло не потрапляє на жоден об'єкт, що кидає тіні. Вмикай тіні тільки там, де це важливо.

Це найважливіше, що ти можеш зробити для покращення продуктивності. Не можу підкреслити це достатньо.

У цьому прикладі є лише одне світло з увімкненими тінями.

pic

Лише зображення в верхньому лівому кутку має увімкнені тіні.

Мінімізуй і групуй шари сортування цілей

  1. Нехай світло впливає тільки на ті шари сортування, що справді мають значення.
  2. Групуй разом шари сортування, на які буде спрямоване світло (вони повинні бути сусідніми).
  3. Якщо кілька світел мають однакові сусідні шари сортування, Unity оптимізує ці обчислення.

Для кожного світла можна налаштувати шари сортування, на які воно буде впливати. Чим менше, тим краще.

І якщо у тебе є кілька світел, які спрямовані на ту саму групу сусідніх шарів, Unity оптимізує ці обчислення і об'єднає їх. Але це працюватиме тільки якщо шари сортування будуть сусідніми!

pic

Лише кілька шарів сортування, і світло використовує сусідні.

Мінімізуй об'єкти, що кидають тіні

  • Мінімізуй кількість об'єктів, що кидають тіні в сцені.

Те саме правило — додавай об'єкти, що кидають тіні, тільки там, де це важливо, а якщо є можливість "об'єднати" об'єкти, що кидають тіні, зроби це. У деяких екстремальних випадках у Dad’s Coming результат був таким:

pic

Так, це все лише один об'єкт, що кидає тіні.

Є компонент Composite Shadow Caster, який має об'єднувати об'єкти, що кидають тіні, але в нашому випадку він не працював. Однак, можливо, це вже виправили.

Інші поради:

  • Світло з інтенсивністю 0 все одно виконує обчислення світла. Вимикай компонент Light 2D, коли це так.
  • Вимикай світло, яке не впливає на нічого видимого/занадто далеко.
  • Вмикай нормальні карти лише там, де це потрібно.
  • Гамма кольорового простору виглядає жахливо для 2D Lights. (Project Settings->Player->Other Settings). Однак, це дає кращу продуктивність.
  • Спробуй експериментувати з параметрами Renderer 2D Data для Light Render Textures, якщо працюєш на мобільних пристроях. (Я сам не тестував, Dad’s Coming — десктопна гра).

Ось і все. Сподіваюся, це буде корисно тим, хто стикається з проблемами продуктивності при використанні 2D світла. Також подивись Dad’s Coming, якщо це тебе цікавить.

Перекладено з: How to optimize 2D Lights in Unity

Leave a Reply

Your email address will not be published. Required fields are marked *