UPL7-2——时间步长和最大允许时间步长
UPL7-2——时间步长和最大允许时间步长
Unity 物理系统中的更新机制
Unity 中的 3D 物理系统基于 Nvidia(英伟达)的 PhysX,2D 物理系统基于开源项目 Box2D
Unity中 对他们进行了封装,我们不需要知道内部是如何执行的,只要调用 Unity 相关API,既可以让两个物理引擎解决方案以相同的方式运行
物理系统的执行机制中,最重要的就是 时间步长(Time Step) 的概念
时间步长在 Unity 中我们一般称为 固定更新时间步长,指的是 物理世界 更新的固定时间间隔
即每隔多长时间更新一次物理逻辑,在 Unity 中默认为每 20 ms(即 0.02 秒,50 Hz) 更新一次
我们可以在 Project Settings ——> Time ——> Fixed Timestep 中进行设置

注意:
物理逻辑是独立于帧率的,不以帧为准,而是严格以固定时间步长为准,一帧里可能执行 0 次、1 次、甚至多次物理循环
即 如果固定时间步长小于实际帧更新耗时,那么在一帧中可能会发生不止一次物理循环更新举例:
- 游戏比较流畅,一帧只跑了 15 ms,那么该帧中物理更新可能不需要执行和更新
- 游戏比较卡顿,一帧跑了 40 ms,那么该帧中物理更新需要连续执行 2 次
也就说,物理更新只以实际经过的时间为准,间隔时间到了固定时间步长就必须更新一次的规则
如果真间隔时间过长,在执行物理逻辑时,必须补满对应执行次数
但是如果掉帧太严重,会丢弃部分时间片,避免无限补帧,可以自己设置丢弃的时间上限
Project Setting ——> Time ——> Maximum Allowed Timestep(最大允许时间步长)进行设置

降低物理步频
从知识回顾我们得知,时间步长其实就决定了在单位时间中物理系统更新的频率
因此,我们可以根据需求,通过提高:Project Settings ——> Time ——> Fixed Timestep
固定时间步长的值来降低物理系统开销,相当于减少物理系统更新次数
但是我们需要进行表现性的权衡,即较高的间隔时间,是否会带来物理系统稳定性与穿透的风险上升,影响我们的表现
谨慎修改最大允许时间步长
Maximum Allowed Timestep(最大允许时间步长)是用于防止游戏在非常卡顿时,造成不停地补物理帧的情况
超过最大允许时间步长的时间会被直接丢弃
举例:
假设 最大允许时间步长 默认值为 0.333 s(333 ms),如果真的卡顿造成帧间隔时间超过这个时间,比如为 0.5 s(500 ms)
那么该帧最多也就补 16 次物理更新逻辑,超过的时间会直接丢弃,不会进行更多次的物理更新了
如果想要通过改小它来优化性能:比如从 0.333 s 改成 0.1 s,需要注意
-
高帧率时
按 Fixed Timestep(物理更新步长)正常算,Maximum Allowed Timestep (最大允许时间步长)不会触发
-
低帧率时
假设某帧掉到 0.2s,如果不修改,Unity 会补 10 个物理更新,如果修改,Unity 最多补 5 个物理更新,剩下 0.1s 的物理更新直接丢弃
虽然看起来,少了一些物理计算,但是从表现上来看,物理对象可能出现瞬移或者跳跃等奇怪表现
因此通过改小 Maximum Allowed Timestep(最大允许时间步长),
虽然 CPU 会少计算物理更新,看起来是减小了消耗,但是会牺牲物理表现的连续性,强行降低了物理精度!
