前两天遇到个问题,在低端机型上FixedUpdate真的能做到固定时间执行吗。这个问题,Emm…
我印象中的FixedUpdate,正如我百度的:
然鹅…大概还有一些小伙伴和我遇到了同样的疑惑:
看来看去,还是自己简单测试一下
private void FixedUpdate() {
index1 ++;
Debug.Log($"FixedUpdate第{index1}次刷新,增量时间:{Time.deltaTime},真实时间:{Time.realtimeSinceStartup}");
}
private void Update() {
index2 ++;
Debug.Log($"-----------------Update第{index2}帧,增量时间:{Time.deltaTime},真实时间:{Time.realtimeSinceStartup}-----------------");
}
![](https://i-blog.csdnimg.cn/blog_migrate/dfe7d8998c2819686bf2c331a6353ef6.png)
如果用增量时间,果然是符合预期的,事实上,这个时间是与真实时间无关的。我们可以在 Edit → Project Setting → Time → Fixed Timestep
设置这个数值
但是真实时间,每次Update之前可能连续迅速执行多次FixedUpdate,也有可能不执行(上图第4帧-第5帧)
FixedUpdate除了用来处理物理逻辑
之外并不适合处理其他模块的逻辑
FixedUpdate固定增量时间的原因
在物理模拟中,保证一个固定的增量时间是十分重要的。这是因为在游戏引擎进行物理模拟时要使用数值积分,而作为最简单的数值积分方法——欧拉法在游戏引擎中大量使用。而在游戏引擎的物理模拟中,一个不稳定的增量时间可能导致很多和预期相悖的结果。
固定的增量时间作为一个常量参数传递给物理模拟模块,这样我们就能够保证物理模拟的增量时间固定,同时还能将物理模拟的更新频率和游戏引擎的更新频率进行解耦——物理的模拟不受引擎的更新频率影响,无论游戏的更新频率是多少,传递给物理模拟的增量时间都是一个常量