没有重写的方法
你不必覆盖 Awake
,Start
,Update
和其他方法的原因是因为它们不是基类中定义的虚方法。
第一次访问脚本时,脚本运行时会查看脚本以查看是否定义了某些方法。如果是,则缓存该信息并将方法添加到其各自的列表中。然后在不同时间简单地循环这些列表。
这些方法不是虚拟的原因是性能。如果所有的脚本都有 Awake
,Start
,OnEnable
,OnDisable
,Update
,LateUpdate
和 FixedUpdate
,那么这些都会被添加到他们的列表中,这意味着所有这些方法都会被执行。通常这不是一个大问题,但是,所有这些方法调用都是从本机端(C++)到管理端(C#),这会带来性能成本。
现在想象一下,所有这些方法都在他们的列表中,其中一些/大多数甚至可能没有实际的方法体。这意味着在调用甚至什么都不做的方法上浪费了大量的性能。为了防止这种情况,Unity 选择不使用虚方法并建立了一个消息传递系统,确保这些方法只有在实际定义时才被调用,从而节省了不必要的方法调用。
你可以在此处阅读 Unity 博客上有关此问题的更多信息: 10000 更新() 以及 IL2CPP 上的更多呼叫 : IL2CPP 内部介绍