unity3d
Выполнение класса MonoBehaviour
Поиск…
Нет переопределенных методов
Причина, по которой вам не нужно переопределять Awake
, Start
, Update
и другой метод, заключается в том, что они не являются виртуальными методами, определенными в базовом классе.
При первом обращении к сценарию сценарий выполнения скриптов просматривает скрипт, чтобы определить, определены ли некоторые методы. Если они есть, эта информация кэшируется и методы добавляются в их соответствующий список. Эти списки затем просто зацикливаются в разное время.
Причина, по которой эти методы не являются виртуальными, связана с производительностью. Если бы все сценарии имели бы Awake
, Start
, OnEnable
, OnDisable
, Update
, LateUpdate
и FixedUpdate
, тогда все они были бы добавлены в их списки, что означало бы, что все эти методы будут выполнены. Обычно это не будет большой проблемой, однако все эти вызовы методов относятся к исходной стороне (C ++) к управляемой стороне (C #), которая поставляется с производительностью.
Теперь представьте себе, что все эти методы находятся в их списках, а некоторые / большинство из них могут даже не иметь фактического тела метода. Это означало бы, что огромное количество производительности тратится на вызов методов, которые даже не делают ничего. Чтобы предотвратить это, Unity отказалась от использования виртуальных методов и сделала систему обмена сообщениями, которая гарантирует, что эти методы будут вызваны только тогда, когда они будут определены на самом деле, сохраняя ненужные вызовы методов.
Вы можете прочитать больше об этом в блоге Unity здесь: 10000 Update () Вызовы и многое другое на IL2CPP здесь: Введение в IL2CPP Internals