沒有重寫的方法

你不必覆蓋 AwakeStartUpdate 和其他方法的原因是因為它們不是基類中定義的虛方法。

第一次訪問指令碼時,指令碼執行時會檢視指令碼以檢視是否定義了某些方法。如果是,則快取該資訊並將方法新增到其各自的列表中。然後在不同時間簡單地迴圈這些列表。

這些方法不是虛擬的原因是效能。如果所有的指令碼都有 AwakeStartOnEnableOnDisableUpdateLateUpdateFixedUpdate,那麼這些都會被新增到他們的列表中,這意味著所有這些方法都會被執行。通常這不是一個大問題,但是,所有這些方法呼叫都是從本機端(C++)到管理端(C#),這會帶來效能成本。

現在想象一下,所有這些方法都在他們的列表中,其中一些/大多數甚至可能沒有實際的方法體。這意味著在呼叫甚至什麼都不做的方法上浪費了大量的效能。為了防止這種情況,Unity 選擇不使用虛方法並建立了一個訊息傳遞系統,確保這些方法只有在實際定義時才被呼叫,從而節省了不必要的方法呼叫。

你可以在此處閱讀 Unity 部落格上有關此問題的更多資訊: 10000 更新() 以及 IL2CPP 上的更多呼叫IL2CPP 內部介紹