虚幻引擎中的物理子步

使用物理 子步(Sub-stepping) 可获取更加精准且稳定的物理模拟,但将造成性能的损失。最明显的改进涉及到布娃娃振动和其他复杂物理资源。

启用子步

在 编辑(Edit) > 项目设置(Project Setting) > 物理(Physics) 标签下可开启子步。

注意

此功能尚处于开发阶段,APEX 销毁无法完美支持。移动设备目前也无法支持此功能。我们将持续对其进行开发,以便优化外观和使用感受。

技术细节

虚幻引擎5(包括虚幻4)使用可变帧率。可变帧率有利于硬件的可延展性,但因物理引擎适用的是小幅固定时间步,其将会此类引擎造成一定困难。设置子步会获取总帧时并将其划分为子步。然后会逐帧多次tick物理模拟。采用的子步数量取决于最大子步差量时间所设置的最小值。最大子步时间越小,模拟越稳定,但CPU的开销将升高。

设置子步对玩家为隐藏状态,意味着须内插或维持对物理引擎的部分调用。举例而言,如用户在单帧中对Actor施加一个力,同时对帧内部设置N次子步,则需要连续施加N次模拟步的力量来达到相同的加速度。同理,如用户设置Actor的目标位置,则须将目标位置内插到多个分步上,以维持理想速度。虚幻引擎已将以上细节进行内部处理,但必需的信息记录将消耗部分CPU和内存。

需要注意的另一个技术细节是子步设置过程中碰撞回调行为的方式。虚幻引擎以一个单独的物理线程执行物理子步,使游戏线程能持续工作。为获得最佳性能,我们将延迟碰撞回调,直到完成最后一个子步。这意味着一个碰撞可能会获得多个回调。例如A和B发生碰撞并弹开,则可能会获得A和B重叠的回调,以及同一帧中A和B不再重叠的回调。所有回调会被内部推入到一个队列中,因此将会在处理来自子步2的回调之前先处理来自子步1的回调。

使用

设置子步将极大提高复杂物理资源的质量(如布娃娃所用的资源)。实际运用中应根据游戏的实际所需,在提高质量和CPU消耗进行权衡。

笔记

布娃娃系统 使用基于物理的仿真来模拟角色骨骼和肌肉的运动。这意味着角色的动作将更加逼真和自然,参考 。

经验

提高物理帧率,会降低仿真的帧率,但至少它使帧率保持了更稳定的状态。

参考

虚幻4的物理子步