目录
第5章 加速物理
5.1 物理引擎的内部工作情况
5.1.1 物理和时间
第5章 加速物理
目前为止,讨论的增强建议集中在降低资源消耗和避免发生帧率问题。
如果错过了重要的碰撞事件,游戏在计算的复杂物理事件时会卡顿,或者玩家摔倒在地上,这些都将对游戏质量产生明显的负面影响。
有些游戏可能根本不使用物理,而另一些游戏则要求物理引擎在游戏期间处理大量任务。
本章介绍减少Unity物理引擎中的CPU峰值、开销和内存消耗的方法,同时包括改变物理行为的方法,在提高或至少保持游戏质量的同时优化性能。
内容:
理解Unity的物理引擎如何工作
- 时间步长和FixedUdpdate
- 碰撞器类型
- 碰撞
- 射线发射
- 刚体激活状态
物理性能优化
- 如何构建场景以优化物理行为
- 使用相应的碰撞器类型
- 优化碰撞矩阵
- 提升物理一致性并避免容易出错的行为
- 布娃娃(Ragdoll)和其他基于关节的(Joint-based)对象
5.1 物理引擎的内部工作情况
两种不同的物理引擎:用于3D物理的Nvidia的PhysX和用于2D物理的开源项目Box2D,两个物理引擎解决方案以功能相同的方式运行。
5.1.1 物理和时间
物理引擎通常是在时间按固定值前进的假设下运行的。每个迭代都称为时间步长。物理引擎将只使用非常特定的时间值来处理每个时间步长,这与渲染上一帧所花费的时间无关。该时间步长在Unity中称为Fixed Update Timestep,它的值默认设置为20毫秒(每秒)。
Unity执行顺序图:https://docs.unity3d.com/Manual/ExecutionOrder.html
固定的更新在物理引擎执行自己的更新之前处理,而这两者之间的联系是不可分割的。这个过程开始于确定是否已经过了足够的时间来开始下一个固定的更新。
在高帧率下, 渲染更新可能会在物理引擎获得更新自身的机会之前完成多次更新。这个过程在运行时不断重复,使固定的更新和物理引擎比渲染具有更高的优先级,同时也强制物理模拟具有固定的帧率。
FixedUpdate()回调是一个用于放置任何期望独立于帧率的游戏行为的好地方。
1.最大允许的时间步长
在物理活动较多时,物理引擎处理固定更新的时间可能比模拟的时间要长。
在这些情况下,物理引擎永远无法摆脱固定的更新循环,并允许另一帧进行渲染,这个问题通常称为死亡螺旋。为了防止物理引擎在这些时刻锁定游戏,存在允许物理引擎处理每个固定更新循环的最长时间。此阈值称为允许的最大时间步长(Maximum Allowed Timestep)。
2.物理更新和运行时变化
应在FixedUpdate()和其他物理回调(OnTriggerEnter)中处理对刚体对象的更改,必须确保在恰当的回调中处理所有与物理相关的行为。
从逻辑上讲,在任何给定的固定更新迭代中花费的时间越多,在下一次游戏逻辑和渲染过程中的时间就越少。
为了保持平滑、一致的帧率,需要通过最小化物理引擎处理任何给定时间步长所需的时间,来为渲染释放尽可能多的时间。