unity3d
Implementacja klasy MonoBehaviour
Szukaj…
Bez przesłoniętych metod
Powodem, dla którego nie musisz zastępować funkcji Awake
, Start
, Update
i innej metody jest to, że nie są to metody wirtualne zdefiniowane w klasie podstawowej.
Przy pierwszym dostępie do skryptu środowisko wykonawcze skryptów przegląda skrypt, aby sprawdzić, czy niektóre metody są zdefiniowane. Jeśli tak, informacje te są buforowane, a metody są dodawane do odpowiedniej listy. Listy te są następnie po prostu zapętlane w różnych momentach.
Powodem, dla którego te metody nie są wirtualne, jest wydajność. Gdyby wszystkie skrypty zawierały Awake
, Start
, OnEnable
, OnDisable
, Update
, LateUpdate
i FixedUpdate
, wówczas wszystkie zostałyby dodane do ich list, co oznaczałoby, że wszystkie te metody zostałyby wykonane. Zwykle nie byłby to duży problem, jednak wszystkie te wywołania metod są od strony macierzystej (C ++) do strony zarządzanej (C #), co wiąże się z kosztem wydajności.
Teraz wyobraź sobie, że wszystkie te metody znajdują się na ich listach, a niektóre / większość z nich może nawet nie mieć rzeczywistej treści metody. Oznaczałoby to, że na wywołanie metod, które nawet nic nie robią, zmarnowana jest ogromna wydajność. Aby temu zapobiec, Unity zrezygnował z korzystania z metod wirtualnych i stworzył system przesyłania wiadomości, który zapewnia, że metody te będą wywoływane tylko wtedy, gdy zostaną faktycznie zdefiniowane, oszczędzając niepotrzebnych wywołań metod.
Możesz przeczytać więcej na ten temat na blogu Unity tutaj: 10000 wywołań aktualizacji () i więcej na temat IL2CPP tutaj: Wprowadzenie do wewnętrznych elementów IL2CPP