请教物理引擎怎么做帧同步.

是这样的,之前做过一个demo

客户端写个netupdate(dt) 函数替换原本update(dt) 函数.

dt则是固定的1/30 或者1/40秒.

依次来保证所有客户端都是同步的,也就是服务端来控制客户端每帧计算.

但是我看到物理引擎似乎没有提供这种方式,我也不知道怎么重写update方法

文档有一段这样的描述

设置物理步长
物理系统是按照一个固定的步长来更新物理世界的,默认这个步长即是你的游戏的帧率:1/framerate。但是有的游戏可能会不希望按照这么高的频率来更新物理世界,毕竟这个操作是比较消耗时间的,那么你可以通过降低步长来达到这个效果。

var manager = cc.director.getPhysicsManager();

// 开启物理步长的设置
manager.enabledAccumulator = true;

// 物理步长,默认 FIXED_TIME_STEP 是 1/60
manager.FIXED_TIME_STEP = 1/30;

// 每次更新物理系统处理速度的迭代次数,默认为 10
manager.VELOCITY_ITERATIONS = 8;

// 每次更新物理系统处理位置的迭代次数,默认为 10
manager.POSITION_ITERATIONS = 8;
注意:降低物理步长和各个属性的迭代次数,都会降低物理的检测频率,所以会更有可能发生刚体穿透的情况,使用时需要考虑到这个情况。

但是实际上我不需要设置步长这些东西 因为 update 改由服务端来推送消息来控制时长了.

请问应该怎么实现物理引擎的帧同步呢,不用物理引擎的话 一些效果实现得不好.

1赞

Creator自带的Box2D物理引擎是不适合拿来做帧同步的。

做帧同步需要使用“确定性”的物理引擎才可以

是个好问题,期待大神解答,mark

必须要定制物理引擎,要做到按帧更新,并且没有浮点数的误差才行,帧同步要保障各个客户端执行逻辑完全一致,否则一点点误差的积累都会导致后续的不同步

道理都差不多,关键是如何实现

mark

恐怕没有什么好的实现方式,是个很枯燥并且困难的改造过程,我们以前用帧同步是没有物理引擎的,但是改动量都很大,甚至连底层引擎都给改了,那时候三个人负责帧同步相关的客户端改造,我们大概花了4个月才完成,要想做物理的首先得吃透依赖的物理库吧,box2d的改造恐怕就够呛了,建议如果不是重度依赖物理库,自己封装一些物理模拟组件可能会更容易,当然性能效果可能就没那么好

3赞

帧同步…同步只是第一步呢 后面怎么处理网络波动才是最难的:sweat_smile:
参考王者荣耀三座大山 https://mp.weixin.qq.com/s/agXeHpN2vkgl5jKsLvi2Ug

物理帧同步手游惊世骇俗的案例应该就是“实况足球”。期待有一天,球类运动的帧同步技术能开放出来就叼了

我在想,能不能将物理逻辑放在服务器上,客户端只发送操作消息,接收服务器运算结果,然后渲染出来

那样就是状态同步来着

只能改引擎了, 这成本太大.

网络波动很好解决吧, 案例很多. 主要是物理引擎的浮点数处理.

mark

mark

不能写一个极简的碰撞系统么

1赞

这是云游戏的思路,5G时代估计能实现:joy:

mark mark

请问楼主,您这个netUpdate 是怎么实现的呢,可以分享一下吗?先感谢了!

1赞

物理引擎与浮点数有关, 这个问题差异是必然的.