网络游戏的同步技术中,FPS 几乎是最复杂的一类,做得好的通常都能成为业界标杆。

以下梳理了几款常见 FPS 游戏的网络同步方案。

使命召唤 OL

玩家之间的同步走基于 UDP 的 P2P 模式,有以下几点佐证:

  • 自己网络正常时,网络差的玩家的移动等状态会在本地直接反馈出来。
  • 网络带宽消耗上,上传约等于下载。
  • 大量透视类外挂的存在。
  • 游戏回放中,延迟和延迟补偿带来的副作用更为明显。与之对应的还有一些高级功能,比如录像回放、死亡回放等——这些功能出现时并没有明显的网络波动,因此大概率是客户端本地计算的结果。要实现本地记录,客户端至少需要持有全量数据,这一点在外挂特征上也和帧同步游戏接近。

另外,当自身网络较差时,跑一段时间后会被拉回原位,这说明服务器大概率存在修正机制。

守望先锋

采用具备一定确定性的状态同步,所有数据都经由服务器中转。客户端只做预测,以实现本地操作的即时反馈。

服务器与客户端之间同步的是数据的变化量。当客户端预测失败时,会利用确定性重新计算来修正状态。统一的计量单位是命令帧,为此游戏还专门采用了面向数据的编程模型来实现游戏逻辑。

预测失败几乎都由网络延迟引起。其他玩家在本地显示的始终是服务器下发的历史状态,但在强交互场景(如玩家之间存在碰撞)下,预测失败的概率会明显上升。

实现难点在于设计高质量的预测算法和数据回滚重演算机制。

当自身网络较差时,本地操作仍然流畅,看到的是其他玩家原地停止做动画或发生瞬移,自己不会被拖拽。

虚幻引擎(UE4)

UE4 内置了一套与守望先锋本质相近的同步方案:在物理演算中支持回退并重新计算,重新计算物理时采用牛顿力学。

穿越火线

带宽消耗特征与使命召唤 OL 相似,上传和下载大致相当,因此猜测玩家同步同样走 P2P 模式。该游戏的外挂种类最多也最为奇特,包括无限手雷、无限子弹等。

和平精英

载具同步基于主从机制:驾驶者负责完整的物理模拟,其他客户端通过导航预测、插值等常规手段跟进。特别之处在于,当即将发生碰撞时,所有客户端都会切入物理模拟,以获得最佳表现效果。

穿越火线手游

手游的做法相对常规——服务器具有绝对权威,负责运行完整的物理模拟。

技术分析与总结

上述游戏几乎都基于纯状态同步。

帧同步最大的缺陷是确定性保障和操作的即时反馈,不过即时性也有改进空间。在原始帧同步的基础上,可以引入一定程度的玩家操作预测。帧同步本身确定性最高,因此预测失败的概率比传统状态同步更低;但需要额外注意预测行为对确定性的影响,处理不当反而会加大不同步的概率。

守望先锋的方案看起来正是帧同步与状态同步各取所长的结合。

上述方案涉及的核心技术关键词:预测、修正、插值、延迟补偿、网络抖动、网络延迟。

在第一人称射击游戏中,玩家对弹道表现的关注度相对较低,副作用因此较小。而在上帝视角的射击游戏中(例如弓箭手大作战),延迟补偿就很难做好——你看到的和其他玩家看到的会产生差异。

一旦放弃对操作即时反馈的要求,很多问题都会变得简单。