FixedUpdate真的能固定时间执行吗

前两天遇到个问题,在低端机型上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}-----------------");
    }

如果用增量时间,果然是符合预期的,事实上,这个时间是与真实时间无关的。我们可以在 Edit → Project Setting → Time → Fixed Timestep 设置这个数值
但是真实时间,每次Update之前可能连续迅速执行多次FixedUpdate,也有可能不执行(上图第4帧-第5帧)
FixedUpdate除了用来处理物理逻辑之外并不适合处理其他模块的逻辑

FixedUpdate固定增量时间的原因

在物理模拟中,保证一个固定的增量时间是十分重要的。这是因为在游戏引擎进行物理模拟时要使用数值积分,而作为最简单的数值积分方法——欧拉法在游戏引擎中大量使用。而在游戏引擎的物理模拟中,一个不稳定的增量时间可能导致很多和预期相悖的结果。

固定的增量时间作为一个常量参数传递给物理模拟模块,这样我们就能够保证物理模拟的增量时间固定,同时还能将物理模拟的更新频率和游戏引擎的更新频率进行解耦——物理的模拟不受引擎的更新频率影响,无论游戏的更新频率是多少,传递给物理模拟的增量时间都是一个常量

参考链接一

猜你喜欢

转载自blog.csdn.net/hzhnzmyz/article/details/121403885