unity3d
Implementierung der MonoBehaviour-Klasse
Suche…
Keine überschriebenen Methoden
Sie müssen Awake
, Start
, Update
und andere Methoden nicht überschreiben, weil sie keine virtuellen Methoden sind, die in einer Basisklasse definiert sind.
Wenn Sie zum ersten Mal auf Ihr Skript zugreifen, durchsucht die Skriptlaufzeit das Skript, um festzustellen, ob einige Methoden definiert sind. Wenn dies der Fall ist, werden diese Informationen zwischengespeichert und die Methoden werden ihrer jeweiligen Liste hinzugefügt. Diese Listen werden dann zu verschiedenen Zeitpunkten einfach durchlaufen.
Der Grund, warum diese Methoden nicht virtuell sind, liegt in der Leistung. Wenn alle Skripts Awake
, Start
, OnEnable
, OnDisable
, Update
, LateUpdate
und FixedUpdate
, werden diese alle zu ihren Listen hinzugefügt. Dies würde bedeuten, dass alle diese Methoden ausgeführt werden. Normalerweise wäre dies kein großes Problem, jedoch erfolgen alle diese Methodenaufrufe von der nativen Seite (C ++) zur verwalteten Seite (C #), was mit einem Leistungsaufwand verbunden ist.
Nun stellen Sie sich vor, alle diese Methoden stehen in ihren Listen und einige / die meisten von ihnen verfügen möglicherweise nicht einmal über einen eigentlichen Methodenkörper. Dies würde bedeuten, dass eine große Menge an Leistung verschwendet wird, wenn Methoden aufgerufen werden, die gar nichts tun. Um dies zu verhindern, hat Unity die Verwendung virtueller Methoden deaktiviert und ein Messagingsystem eingerichtet, das sicherstellt, dass diese Methoden nur dann aufgerufen werden, wenn sie tatsächlich definiert sind, wodurch unnötige Methodenaufrufe eingespart werden.
Weitere Informationen zu diesem Thema finden Sie hier in einem Unity-Blog: 10000 Update () Aufrufe und mehr zu IL2CPP hier: Eine Einführung in IL2CPP-Interna