unity3d
Implementatie van MonoBehaviour-klasse
Zoeken…
Geen overschreven methoden
De reden dat u Awake
, Start
, Update
en andere methode niet hoeft te negeren, is omdat het geen virtuele methoden zijn die in een basisklasse zijn gedefinieerd.
De eerste keer dat u toegang krijgt tot uw script, kijkt de scriptlooptijd door het script om te zien of bepaalde methoden zijn gedefinieerd. Als dit het geval is, wordt die informatie in de cache opgeslagen en worden de methoden aan hun respectieve lijst toegevoegd. Deze lijsten worden vervolgens eenvoudig op verschillende tijdstippen doorgelust.
De reden dat deze methoden niet virtueel zijn, is vanwege de prestaties. Als alle scripts Awake
, Start
, OnEnable
, OnDisable
, Update
, LateUpdate
en FixedUpdate
, dan zouden deze allemaal aan hun lijsten worden toegevoegd, wat zou betekenen dat al deze methoden worden uitgevoerd. Normaal gesproken zou dit geen groot probleem zijn, maar al deze methodeaanroepen zijn van de native kant (C ++) tot de beheerde kant (C #) die gepaard gaat met prestatiekosten.
Stel je dit eens voor, al deze methoden staan in hun lijsten en sommige / de meeste hebben misschien niet eens een echte methode. Dit zou betekenen dat er enorm veel prestaties verspild worden aan oproepmethoden die zelfs niets doen. Om dit te voorkomen, heeft Unity ervoor gekozen om geen virtuele methoden te gebruiken en een berichtensysteem gemaakt dat ervoor zorgt dat deze methoden alleen worden aangeroepen wanneer ze daadwerkelijk zijn gedefinieerd, waardoor onnodige methodeaanroepen worden bespaard.
U kunt hier meer lezen op een Unity-blog: 10000 Update () Calls en meer op IL2CPP hier: een inleiding tot IL2CPP Internals