Руководство по оптимизации кода
В методах 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