看来这位哥们也对同步技术深有了解啊,理念和我的都差不多。
我确实是做过几个真实对战游戏项目的开发,翻阅过很多资料,填过一波坑,最后才了解同步技术的原理的。
不过你说引擎的碰撞检测不能用不是因为定点数的原因,是因为这个碰撞检测是基于物体的渲染位置和渲染帧做检测的,而你的渲染位置又要通过插值lerp到逻辑位置,在相同的逻辑帧,每个玩家的渲染帧位置肯定是不同的,还有渲染帧的帧率也不同,所以用引擎的碰撞系统肯定做不了同步。你把浏览器退出到后台,渲染帧会停止,逻辑帧再怎么跑,都不会触发物理引擎的碰撞检测。
楼主的那种做法也不算是状态同步,逻辑各算各的再互相转发结果给对方,但是忽略一点,没有引入一个裁决者,没法判断谁的结果是正确的。比如场景里有个道具,两个玩家同时去抢,双方在几乎同一瞬间碰到道具,并且通知对方我抢到道具了,最后双方在自己抢到道具的同时,之后又接收到了对方也抢到这个道具的消息。那么这个道具到底是谁抢到了?各算各的没有一个裁决者,导致逻辑混乱。像传统的状态同步,逻辑都是运行在服务端的,由服务端通知各客户端当前游戏和各玩家的逻辑状态,每个玩家把这些状态通过画面显示出来,裁决者是服务端,胜负结果也是服务端通知。
我说他的同步是“状态同步”,带了引号了。碰撞检测不能用,定点数是原因之一,物理引擎有的会提供帧驱动API的(好像P2就是,把源码改成定点数,就能用了,不过一般游戏只需要碰撞检测,自己写个难度不大),逻辑帧可以去驱动物理引擎,渲染位置和朝向都可以通过逻辑数据去跟物理引擎的位置同步,我记得unity有个物理引擎就是专门给帧同步写的,叫啥名字忘了,不重要了,哈哈。
!