Цель: несколько советов по оптимизации скриптов для повышения производительности игры.

В этой статье мы сосредоточимся на некоторых советах по оптимизации скриптов, чтобы получить тот же результат с меньшим объемом выделения памяти для сбора мусора.

Кэш GetComponent

GetComponent() будет серьезной проблемой при использовании его в Update(), что приведет к сборке большого количества мусора в каждом кадре.
В этой ситуации лучший способ решить эту проблему — кэшировать GetComponent() в Start() с помощью переменной вместо ее вызова в Update().

Вот пример:
В этом скрипте мы случайным образом меняем цвет куба на каждом кадре.

При запуске игры это приведет к выделению большого количества мусора.

Однако, если мы кэшируем GetComponent() в Start(), а также кэшируем новый цвет из метода возвращаемого типа вместо вычисления в Update():

Вот результат после оптимизации:

Как видите, GC Alloc успешно уменьшил разрядность с 338 до 86 бит. И это только простая функция смены цвета на базовом кубе. Представьте, что у вас есть более сложная игра, которая постоянно вызывает задержки из-за вызова GetComponent() в каждом кадре.

Кэш WaitForSeconds

Есть еще один пример оптимизации вашего скрипта, который называется WaitForSeconds() в сопрограмме. Для общего использования мы всегда вызываем сопрограмму, используя:

yield return new WaitForSeconds();

Однако это также можно кэшировать как переменную для сохранения памяти.
Вот пример разницы:
Давайте создадим сопрограмму, которая будет выполнять обработку каждые 0,1 секунды, и назовем ее NormalRoutin(). .

Тем временем создайте еще одну сопрограмму, выполняющую ту же функцию, но с переменной, кэширующей WaitForSeconds().

Давайте вызовем обе эти сопрограммы в Start(), затем запустим игру, чтобы проверить Profiler.
И вы должны увидеть разницу GC Alloc между NormalRoutine и Оптимизировать подпрограмму.

Дополнительные советы по экономии памяти

  • При создании RayCast через камеру вместо установки луча с помощью Camera.main кэшируйте камеру как ссылку, чтобы предотвратить многократное создание класса камеры.

  • По сравнению с List, Array требует больше ресурсов при вызове. Попробуйте List!
  • string занимает больше ресурсов, чем вы думали!
  • При создании пользовательского class с менее чем 5 переменными попробуйте создать его с struct вместо class, что быстрее и эффективнее.