FPS游戏网络同步方案
网络游戏同步技术上FPS几乎是最复杂的,做得好的一般都是业界标杆了。
常见FPS游戏的同步方案:
使命召唤OL:玩家本身走的是基于UDP的P2P模式,这里有几个佐证
1.自己网络没问题,网络差的玩家的移动等 会在本地反馈下来
2.网络带宽消耗 上传约等于下载
4.大量透视等外挂的存在
5.游戏回放中,延迟和延迟补偿带来的副作用更为明显,对应匹配的还有一些高级的功能,比如录像回放,死亡回放等,在出现的时候并没有明显的网络波动,因此大概率是客户端本地计算的结果,要实现本地记录,那么至少有所有数据,在外挂体现上和帧同步的游戏差不多。
在自身网络较差的时候,跑一段时间会被拉回,从这里来看大概率是有服务器修正的
守望先锋:具备一定的确定性的状态同步,所有都走服务器,客户端来说只会进行预测来实现本地操作的及时反馈。
服务器和客户端同步的是数据的变化量,客户端预测失败时将会利用确定性进行重新计算来修正。服务器和客户端统一的衡量点就是命令帧。为此还专门采用面向数据的编程模型来实现游戏逻辑
预测失败本身几乎都是网络延迟导致的,其他玩家在本地的都是服务器同步过来的,是一个历史的状态,但存在强交互时预测失败的概率会上升,比如玩家之间能够产生碰撞。
实现难点就是实现很好的预测和数据回滚重新演算。
自身网络差的时候,本地操作都很流畅,看到的是其他玩家停住原地表现动画,或者瞬移,自己是不会被拖拽的。
虚幻引擎:UE4内置了一套类似的同步方案,本质和守望先锋的差不多,在物理的演算中能够回退并且重新计算,重新计算物理的方案是牛顿力学。
穿越火线:带宽消耗上和使命召唤OL很像,上传和下载差不多,所以猜测玩家同步是P2P模式,该游戏的外挂最多也最神奇,无限手雷,无限子弹等等。
和平精英:载具的同步基于主从机制,开车的负责完整的模拟,其他客户端进行导航预测,插值等常规手法,有点区别的就是在即将发生碰撞时所有客户端将会进行物理模拟来达到最好的表现力。
穿越火线手游:手游的做法就很常规了,服务器是权威,跑着物理模拟。
上述游戏几乎都是基于纯状态同步的。
帧同步最大的缺陷就是确定性和操作及的即时反馈,不过及时性也有改进的方法。
在原始的帧同步的基础上,可以进行一定的玩家操作预测,帧同步的确定性是最高的,因此预测失败的概率比传统的状态同步小,额外需要注意的就是预测行为对确定性的影响,处理不好就会加大不同步的概率。
守望先锋的做法看起来就像是帧同步和状态同步的各取所长的结合体
上述总结一下几个技术关键词:预测,修正,插值,延迟补偿,网络抖动,网络延迟。
第一人称射击游戏中对于弹道的表现玩家的关注度比较低,因此副作用较小,在上帝视角的射击游戏中,比如弓箭手大作战,延迟补偿的作用就很难做了,你看到的和其他玩家看到的会不一样。
当舍弃了操作的及时反馈性后,很多问题都可以很简单了。