跳至主要內容

CocosCreator 物理帧同步

muzzik大约 2 分钟文章CocosCocosCreator帧同步

对于物理帧同步的记录

已知规则

  • JavaScript 的浮点基础运算在各个平台是一致的(遵守ECMAScript 2015 (ES6))

https://stackoverflow.com/questions/42181795/is-ieee-754-2008-deterministicopen in new window

  • JavaScript 三角函数是提供了建议实现,实际只需要达到近似值即可满足要求,所以在各个平台可能并不一致

https://262.ecma-international.org/6.0/#sec-function-properties-of-the-math-objectopen in new window

https://forum.cocos.org/t/topic/155837open in new window

  • WASM 的浮点运算是确定性的

https://forum.cocos.org/t/topic/155837/4open in new window

  • C++ 的浮点数运算需要确保相同的架构和编译器才能确保一致

https://stackoverflow.com/questions/20963419/cross-platform-floating-point-consistencyopen in new window

帧同步

  • 手动物理引擎步进:非手动控制步进会导致物理世界运算(step)次数不一致,导致最终的结果差异

cc.PhysicsSystem2D.instance.autoSimulation = false;
cc.PhysicsSystem2D.instance.enable = false 需要在脚本加载时被执行,防止物理世界自动执行 step

  • 预测:使用渲染预测,物理世界依旧暂停,只控制渲染移动。回滚时只需要控制渲染位置即可

  • 确保物理世界的一致性:在 Cocos 的物理引擎实现中,通常只是做一个接口同步物理和渲染,所以物理引擎内还存在刚体的坐标与旋转数据。为了确保多端的物理世界数据一致,需要确保节点的 世界坐标世界旋转 在多端一致,具体可以自行查看物理引擎的 syncSceneToPhysics 实现。

  • 重置物理引擎实例:个人推测也是因为设备间物理世界运算次数不一致导致的。解决方式为要么根据服务器指令结束物理循环(运算相同次数),要么重置物理引擎实例

https://forum.cocos.org/t/topic/136991?u=1226085293open in new window

Web 帧同步

  • 修改三角函数:在我个人测试中,safari 和 chrome 的表现结果一致,但由于三角函数的不确定性,建议还是修改三角函数为确定性实现。并不一定需要使用查表法(提前存储结果),由于 JS 四则运算的一致性,我们可以使用 JS 自身实现,这里推荐使用 stdlibopen in new window 库。

原生帧同步

  • 使用 2.x 版本引擎:保证使用的物理引擎编程语言相同,最好是使用 js 或者 wasm 类型的物理引擎,C++ 需要保证相同架构和编译器,才能防止语言带来的浮点数差异

多端帧同步

  • 保证多端的物理引擎语言相同:需要查看两端使用的物理引擎编程语言是否为同一种,例如一端为 WASM(确定性),一端 C++,那么可能会导致不同步。解决方式为使用定点数物理引擎,例如 repper.js

https://forum.cocos.org/t/topic/133618/44open in new window

参考资料

📣 觉得很赞?分享给你的朋友吧!