Unity如何使用轮询来处理所有Input事件,如果有新事件,检查每个更新循环是否效率非常低?如果每个更新周期我有1个mio对象,我会假设常量轮询会显着减慢系统速度。
public void Update() {
if (Input.GetKeyUp(KeyCode.Escape)) {
// escape clicked
}
}
为什么没有这样的东西:
public void Start() {
Input.addKeyUpListener(KeyCode.Escape, delegate {
// escape clicked
});
}
答案 0 :(得分:5)
请注意,Unity每次调用其中一种方法时都不轮询系统 - 而是每帧轮询一次,然后缓存该值,如下所示: ResetInputAxes
函数。
这不是唯一一个看似疯狂的东西的地方,但在较低级别的代码中可能更有效 - 请记住Unity为运行时维护了很多自定义(特别是对于垃圾收集和构造)与标准C#不同。
另请注意,回调逻辑虽然适用于处理程序以及通常长寿命的对象(如单例和系统),但对于通常在游戏生命周期中多次收集和创建的脚本而言并不是那么好。由于Unity只暴露了使用代码创建脚本的能力,因此轮询更有意义,而不是使用需要附加,处理和分离行为的回调来防止错误。