Руководство по оптимизации кода

  • В методах Update, FixedUpdate, LateUpdate и в частых таймерах стараемся не использовать ключевое слово “new”, чтобы не создавать мусор. Делаем это заранее, если возможно, в самом инспекторе или в Start или Awake, и кешируем в переменную

  • Создавать один раз и использовать многократно!”. В большинстве своем это относится к контейнерам, которые многократно обновляются. Вместо их создания на месте, лучше создать их в классе, а перед обновлением просто очищать через Clear()

  • Избегайте методов поиска и получения компонентов, так как они очень долгие. По возможности выносите их в инициализацию или кешируйте

  • Избегайте рэйкастов и прочих кастов в апдейте без необходимости.

  • Избегайте конкатенации строк. При их конкатенации, каждый раз создается новый объект строки (скрытая команда “new”). Все возможные значения строки лучше всего создать заранее (например массив из чисел в виде строк от 0 до 9), и использовать закешированные строки вместо кастований и последующих конкатинаций. Если это затруднительно, то используйте StringBuilder. В стартерпке есть класс “CMath”, в котором есть массив из строк от 0 до 100

  • Используйте функции, не выполняющие выделение памяти. Например, в unity есть функция Physics2D.CircleCast(), а есть более оптимизированный аналог Physics2D.CircleCastNonAlloc() с приставкой NonAlloc, говорящий, что метод не будет выделять дополнительную память

  • Не используйте LINQ в апдейте. Его всегда можно заменить обычными алгоритмами

  • Использовать Pool Manager (есть в стартерпаке), если вы собираетесь спавнить или уничтожать много одинаковых объектов

  • Выполняйте код только тогда, когда это необходимо. Для этого вам помогут эвенты и реактивное программирование

  • Используйте массивы вместо списков, где это только возможно

  • Если делаете RayCast или ColliderCast, то изначально фильтруйте объекты по слоям, особенно если это происходит в апдейте

  • При сравнивании тега используем CompareTag(“tag”), вместо tag == “tag”

  • Свойство LocalPosition работает быстрее, чем Position

  • Не используйте статические свойства кватернионов, векторов и т.д. (Например, Vector.Up). Под капотом там происходит создание нового объекта. Поэтому кешируйте его перед множественным использованием, или юзайте класс “CMath”, его описание есть в стартерпаке

  • Все строки используемые в Animator-объектах следует конвертировать в целочисленные идентификаторы через private static int name = new Animator.StringToHash(“Run”)

  • Используйте sqrMagnitude вместо magnitude в векторах, не используем Distance(). У Distance под капотом происходит создание нового объекта класса векторов и потом возврат его длины. Magnitude как и sqrMagnitude не создают новый объект, соответственно не выделяется память и не генерится мусор.

  • Используйте Color32 и Mesh.colors32 вместо Color и Mesh.colors при доступе к цветам меша

  • Не используем исключения, они низкопроизводительны

  • Не плодим rigidbody, и деактивируем, если они не используются (особенно относится к рэгдоллу)

  • Для RectTransform и Transform юзать SetParent, вместо parent

  • Вместо GetComponent<RectTransform> используем transform as RectTransform

  • Вместо (SomeClass) obj при апкасте используем оператор “obj as SomeClass”

  • Выключение дебага

Last updated