Цель: несколько советов по оптимизации скриптов для повышения производительности игры.
В этой статье мы сосредоточимся на некоторых советах по оптимизации скриптов, чтобы получить тот же результат с меньшим объемом выделения памяти для сбора мусора.
Кэш 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
, что быстрее и эффективнее.