Unity帧速度原理(模拟Update及FixedUpdate)

Unity帧速度原理


我们在使用Unity时有一个非常重要的参数:帧数
帧数是指每秒可进行渲染和逻辑计算的次数,游戏每运行一帧,都要处理逻辑,物理,动画,渲染等工作,其中最耗时的操作往往是就是渲染,模拟代码如下:

while(!Stop())
{
   doRender();
   doAnimation();
   doLogical();
   ...
}

而每次执行一遍所用的时常就是帧数:

while(!Stop())
{
 	float currentFrame = GetCurrentTime();
	deltaTime = currentFrame - lastFrame;
	lastFrame = currentFrame;
   doRender();
   doAnimation();
   doLogical();
   ...
}

如上例展示,deltaTime就是Unity中非常常见的deltaTime,而帧数就是每秒执行的while循环体内的逻辑的次数。

注意这里往往不建议处理物理问题,因为在Unity中,上述模拟的是update函数,而建议处理物理的函数是fixedUpdate

和Update主帧循环不同,Unity的刚体系统通过固定的时间来驱动,固定的运算时间是保证模拟结果准确一致的重要因素 。在刚体系统运算开始前,Unity会根据上一次刚体运算完成的时间再加上Fixed Timestep的所设置的值来作为这一次刚体运算时间的限定范围。然后刚体系统会开始计算,直到达到这个时间限制临界点。

Unity中,通过Time Manager可以调整Fixed Timestep的值,也可以在脚本中通过访问Time.fixedDeltaTime属性来读取这个值。注意,更低的Fixed Timestep值会让刚体模拟次数更频繁,结果也更精确,但代价是CPU的性能开销也会更大。除非你对物体引擎有更高的要求,否则一般不建议更改默认的设置。

Fixed Timestep保证了刚体模拟的实时准确运算,但也会导致一些问题,当游戏中物理运算量比较多时,会导致游戏帧率变低(因为游戏中的物体数量非常多,运算量会非常大)。而游戏的主循环(Update)必须在在常规的物理运算FixedUpdate()调用之间进行,当有大量的物体运算要进行处理时就会在一个主循环帧(Update)当中进行多次物理运算(FixedUpdate).在主循环帧开始的时候,物体的位置和其它属性都是固定不变的,因此在这一帧里显卡所显示的最终结果与更高频率的物理运算结果是不同步的。

发布了63 篇原创文章 · 获赞 227 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_36696486/article/details/104457278