【转载】快节奏多人游戏(第 IV 部分):延迟补偿

[介绍]

前三篇文章:
【转载】快节奏多人游戏(第 I 部分):客户端-服务器游戏架构 - Creator 3.x - Cocos中文社区
【转载】快节奏多人游戏(第 II 部分):客户端预测和服务器对帐 - Creator 3.x - Cocos中文社区
【转载】快节奏多人游戏(第 III 部分):实体插值 - Creator 3.x - Cocos中文社区

可以总结如下:

  • Server 从所有客户端获取带有时间戳的 input
  • 服务器处理输入并更新世界状态
  • Server 将常规全局快照发送到所有客户端
  • 客户端发送输入并在本地模拟其效果
  • 客户端获取世界更新和
    • 将预测状态同步到权威状态
    • 为其他实体插入已知的过去状态

从玩家的角度来看,这有两个重要的后果:

  • 玩家在 当下 看到 自己
  • 玩家看到 过去的 其他实体

这种情况通常很好,但对于时间和空间非常敏感的事件来说,它就相当成问题了;例如,向敌人的头部射击!

[滞后补偿]

所以你用你的狙击步枪完美地瞄准目标的头部。你投篮 - 这是你不能错过的投篮。

但你错过了。

为什么会这样?

由于前面解释的客户端-服务器架构,您在射击 100 毫秒瞄准敌人的头部位置 - 而不是 在您射击时!

在某种程度上,这就像在一个光速非常非常慢的宇宙中玩耍;你瞄准的是敌人过去的位置,但当你扣动扳机时,他们早已消失了。

幸运的是,有一个相对简单的解决方案,大多数时候对 大多数 玩家来说 也是愉快的(下面讨论的一个例外)。

以下是它的工作原理:

  • 当您射击时,客户端会将此事件发送到服务器,其中包含完整信息:射击的确切时间戳和武器的确切瞄准。
  • 这是关键的一步 。由于服务器获取带有时间戳的所有输入,因此它可以权威地重建过去任何时刻的世界。特别是,它可以在任何时间点完全按照任何客户端的样子重建世界。
  • 这意味着服务器可以在您射击的瞬间确切地知道您的武器瞄准镜上有什么。这是你敌人的 头部过去 的位置,但服务器知道这是他们的头部在 现在的位置。
  • 服务器在该 时间点 处理镜头,并更新客户端。

每个人都很高兴!

服务器很高兴,因为它是服务器。它总是很快乐。

你很高兴,因为你瞄准了敌人的头部,开了一枪,并获得了有益的爆头!

敌人可能是唯一一个不完全快乐的人。如果他们在他被枪杀时站着不动,那是他们的错,对吧?如果他们正在移动…哇,你真是个了不起的狙击手。

但是,如果他们处于空旷的位置,躲在墙后面, 然后在 几分之一秒后,当他们认为自己是安全的时被枪杀呢?

嗯,这可能会发生。这就是你所做的权衡。因为你过去向他开枪,所以他们可能在躲避后几毫秒内仍会被射击。

这有点不公平,但对于所有相关人员来说,这是最令人满意的解决方案。如果错过一个不容错过的镜头,那就更糟糕了!

[结论]

我关于快节奏多人游戏的系列到此结束。这种事情显然很难做到正确,但对正在发生的事情有一个清晰的概念理解,它并不难。

尽管这些文章的受众是游戏开发者,但它找到了另一组感兴趣的读者:游戏玩家!从游戏玩家的角度来看,理解为什么有些事情会以这种方式发生也很有趣。

转载于: 滞后补偿 - Gabriel Gambetta

1赞