Ricerca…


Nessun metodo sottoposto a override

La ragione per cui non è necessario sovrascrivere Awake , Start , Update e altri metodi è perché non sono metodi virtuali definiti in una classe base.

La prima volta che si accede allo script, il runtime di script esamina lo script per vedere se sono definiti alcuni metodi. Se lo sono, tali informazioni vengono memorizzate nella cache e i metodi vengono aggiunti al rispettivo elenco. Queste liste sono quindi semplicemente passate in loop in momenti diversi.

Il motivo per cui questi metodi non sono virtuali dipende dalle prestazioni. Se tutti gli script avessero Awake , Start , OnEnable , OnDisable , Update , LateUpdate e FixedUpdate , questi sarebbero tutti aggiunti ai loro elenchi, il che significa che tutti questi metodi verranno eseguiti. Normalmente questo non sarebbe un grosso problema, tuttavia, tutte queste chiamate di metodo sono dal lato nativo (C ++) al lato gestito (C #) che viene fornito con un costo di prestazioni.

Ora immagina questo, tutti questi metodi sono nelle loro liste e alcuni / molti di loro potrebbero non avere nemmeno un corpo di metodo reale. Ciò significherebbe che c'è un'enorme quantità di prestazioni sprecate nel chiamare metodi che non fanno nulla. Per evitare ciò, Unity ha scelto di non utilizzare metodi virtuali e ha creato un sistema di messaggistica che si assicura che questi metodi vengano richiamati solo quando vengono effettivamente definiti, salvando chiamate di metodo non necessarie.

Puoi leggere ulteriori informazioni sull'argomento su un blog Unity qui sopra: 10000 Update () Chiamate e altro su IL2CPP qui: Introduzione agli interni IL2CPP



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow