unity3d
MonoBehaviourクラスの実装
サーチ…
オーバーライドされないメソッド
Awake
、 Start
、 Update
などのメソッドをオーバーライドする必要がないのは、基本クラスで定義された仮想メソッドではないためです。
スクリプトが初めてアクセスされるとき、スクリプトランタイムはスクリプトを調べて、いくつかのメソッドが定義されているかどうかを調べます。これらの情報がキャッシュされている場合、その情報はキャッシュされ、メソッドはそれぞれのリストに追加されます。これらのリストは、異なる時間にループされます。
これらのメソッドが仮想でない理由は、パフォーマンスのためです。すべてのスクリプトにAwake
、 Start
、 OnEnable
、 OnDisable
、 Update
、 LateUpdate
、 FixedUpdate
場合は、これらすべてがリストに追加され、これらのメソッドがすべて実行されることになります。通常、これは大きな問題ではありませんが、これらのメソッド呼び出しはすべてネイティブ側(C ++)から管理側(C#)にあり、パフォーマンスコストが発生します。
これを想像してみてください。これらのメソッドはすべてリストにあり、ほとんどのメソッドは実際のメソッド本体を持っていないかもしれません。これは、何もしないメソッドを呼び出す際に膨大な量のパフォーマンスが無駄になることを意味します。これを防ぐために、Unityは仮想メソッドを使用しないようにし、これらのメソッドが実際に定義されたときにのみ呼び出されるようにするメッセージングシステムを作成し、不要なメソッド呼び出しを保存しました。
ここでUnityブログの問題についてもっと読むことができます: 10000 Update()コールとその他のIL2CPPについては、ここをクリックしてください: IL2CPPの概要