联网2D游戏的延迟补偿


31

我想制作一个2D游戏,基本上是物理驱动的沙箱/活动游戏。我确实有些不明白。根据研究,似乎服务器更新仅应大约每100毫秒一次。我可以看到这对玩家是如何工作的,因为他们可以同时模拟物理并通过插值进行滞后补偿。

我不明白的是,这对于其他玩家的更新如何起作用。如果客户仅每100毫秒就收到玩家位置的通知,我就看不到这是怎么回事,因为在100毫秒内会发生很多事情。玩家可能在那个时候两次改变了方向。我想知道是否有人会对这个问题有所了解。

基本上,这对于射击之类的东西如何起作用?

谢谢

Answers:


58

不喜欢长答案的人的总结...

可以做到,但是如果有任何延迟,就不可能完成完美的多人游戏。解释了延迟为什么会影响物理的原因,然后提供了减少延迟对物理模拟的影响的提示。


创建多人物理游戏可能会充满危险。创建“完美”的在线多人物理体验是不可能的。您可以做一些事情来改善它,但是假设任何延迟,都无法实现完美的物理效果。

问题是,物理必须快速且对现实具有响应能力,但同时必须基于所有因素的综合作用来计算,这意味着所有参与者的综合作用。而且,如果存在延迟,则无法实时完成。

作为开发人员,您需要决定是否可以控制各种因素,并了解如果延迟时间过长,播放器的体验会下降。如果您可以接受(并且您的玩家可以接受),那就去吧。有关如何使事情保持平稳运行的一些说明,请参阅本文末尾。

展示如何弄乱事物的示例

想象一个游戏,其中有两个玩家(客户端)连接到服务器。一条消息从客户端到服务器通过Internet花费100毫秒(1/10秒)。玩家做某事时,会向服务器发送一条消息,说明他们做了什么。然后,服务器将消息广播给其他玩家,以便他们都知道代理玩家的所作所为。

现在创建一个场景,其中两个玩家在地面上有一个板条箱,这是一个物理对象。玩家A一侧击球,使其朝某个方向移动。但是,与此同时,玩家B在另一侧击中它,从而向其发送了另一个方向。

让我们看一下处理此问题的不同方法以及结果是什么...

如果仅在服务器上计算物理量怎么办?

假设我们仅在服务器上计算了物理场。玩家A向服务器发送“我以此方式击中箱子”消息,服务器在1/10秒后收到消息。玩家B发送了“我以其他方式击中箱子”的消息。服务器根据这两个动作的组合来计算物理变化,然后将消息发送回两个玩家,说:“好吧,它就这样运动。” 完美的物理表现是基于两个参与者的综合行动来完成的。

但是问题是,任一位玩家看到板条箱做出反应都将是2/10秒。来自两个播放器的消息都需要1/10秒才能到达服务器,然后再用1/10秒的时间发送给两个播放器的服务器计算结果。

底线是游戏延迟。

如果只是在客户端上计算物理量怎么办?

假设我们仅在客户端上计算了物理学。让我们从玩家A的角度来看它。玩家A击中板条箱,它立即开始向其方向移动。还会向服务器发送一条消息,说明玩家A做了什么。

但是,与此同时,B命中了他们,看到了箱子朝他们的方向前进,并向服务器发送了关于他们所做的消息。

2/10秒后,一条消息从服务器到达客户端。A被告知B做了什么,B被告知A做了什么。两位客户都说,问题在于,“好手X可能已经在该位置击中了,但是该位置不再有板条箱,因此他们的命中什么也没做。”

最重要的是,两场比赛不同步,玩家没有共同的经历。如果多人游戏看到不同的事物,那又有什么意义呢?

如果在客户端和服务器上都计算物理量怎么办?

在这种情况下,物理是在客户端上计算的,因此玩家会立即看到无延迟反应,但是它也在服务器上进行了计算,因此对所有玩家都是“正确的”。

两名球员都按各自的方向击中了板条箱,并且每个人都仅根据击中板条箱看到了移动。但是随后2/10秒后,服务器又回来了,并说:“实际上,你们俩都错了。板条箱就这样走了。” 突然,两个玩家都看到了板条箱彻底改变了方向,并将小故障转移到了新的位置。

最重要的是,一个小故障游戏。

结论

基本上,如果存在任何类型的延迟,就无法与多个玩家一起制作完美的物理游戏。您可以制作出不错的游戏,但始终会有过度延迟的风险,从而给某些玩家带来糟糕的体验。但是,您可以采取一些措施来保持良好的游戏体验。

您可以做的使多人游戏运行良好的事情

使用简单的碰撞体积。当简单的立方体形状可以完成时,不要理会用物理方法对形状的每个细节建模。尖刺球不必建模为物理上的尖刺球。而是将其建模为一个球体。

使小的无关紧要的对象仅作为客户端项目。一个例子可能是破碎的窗户上的碎玻璃碎片。您可以让每个客户端自己模拟它,如果它们不同,则实际上并不重要。

仅当需要使对象成为物理对象以使活动物理对象的数量保持较低时,才使它们成为物理对象。

在进行多人游戏时,请以慢动作运行游戏。想想“子弹时间”。慢动作游戏可以补偿延迟,并允许多个玩家一起与物理互动。

允许玩家一起设置某种情况,然后根据提示对两个玩家进行物理模拟,并观察他们组合动作的结果。直到序列完成,玩家才可以干预序列。

分开播放器,以免彼此干扰。这对于保龄球或台球这样的游戏非常有用,一次只能由一个玩家控制,或者每个玩家都有自己的“沙盒”(如保龄球道)。

如果您无法击败'em,请加入'em,并使物理滞后成为您游戏的一部分。想象一下一个故事,它处于一个故障的宇宙中,具有破裂的物理定律或其他东西:)

附录:射击游戏如何处理

射击游戏通过不做过于复杂的物理处理它。它们确实使用了客户端副作用,因此玩家可以快速看到事物,但是服务器随后对发生的事情进行最后的呼叫。

想象一个场景,玩家A射击玩家B。您的典型射击游戏将执行以下操作:

  1. A会本地计算他们是否击中B,并且如果看起来有击中,它将起到“击打”的效果,例如吸血鬼。这是在客户端完成的,因此玩家可以立即看到对其动作的反应。如果您不这样做,游戏会感觉很落后。
  2. A还向服务器发送一条消息,说“我沿着这个矢量射击”
  3. 服务器收到消息后,将查看IT认为玩家所在的位置,并确定A的射门矢量是否击中了B。
  4. 如果服务器确定A命中B,则服务器确定B被命中,然后向两个客户端发送一条消息,说明发生了什么。
  5. 如果服务器确定A没命中B,则B没问题,并且A“未命中”。看起来A就像他们打了一样(“我看到了吸血鬼!”),但这是他们错过的服务器呼叫。

那么,当A小姐B看起来像打他们时,又如何呢?因为B可能已经移动,但是A尚未看到它,因为服务器尚未发送“ B移到这里”消息给客户端。

Valve在他们的网站上对此有很好的文章。参见http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking


2
在连接良好的服务器上确实如此。在很多情况下,多人游戏中的物理失败,而且我相信Garry的Mod游戏中会存在很多不良的物理经验。但是,如果存在延迟,则会出现我概述的问题。您无法回避这样一个事实,即需要非常快速地计算物理量才能变得平滑。而且,如果您有延迟,则会有延迟。延迟意味着滞后。
Tim Holt 2010年

1
您可能想返回并重新阅读我的帖子。除去前端的一些意见,我正在准确描述在多名玩家进行物理模拟时发生的情况-包括Garry的Mod游戏环节。你无法绕开事实。
蒂姆·霍尔特

2
好的,我将我的下票改为上票。但是,如果您以前曾做过并且相对没有毛病,那么您会为带有物理的多人游戏画一个非常消极的图画。
AttackingHobo 2010年

7
@AttackingHobo:“小故障”是相对的。在开发具有良好网络预测的游戏之后,我现在看到了以前从未出现过的故障。它们很少有效地影响机械性能,但它们存在。预测的全部要点是,较小的实时误差比延迟的精度要好。这不会改变您总是不准确的事实。

1
+1代表“想像一个故事,该故事处于物理定律破裂或类似问题的小故障宇宙中”。
Patryk Czachurski 2014年

13

我在这里写了一系列有关该主题的文章:http : //www.gabrielgambetta.com/fpm1.html

前三篇文章介绍了该主题,客户端预测,服务器对帐和实体插值(这是回答您的特定问题的部分)的介绍。第四篇文章(即将发布)将涉及“射击内容” :)

蒂姆·霍尔特(Tim Holt)的答案差不多。我的文章有几个图表可以帮助您了解正在发生的事情,但是Tim和我基本上是在说同样的话。


好东西!
Tim Holt 2010年

2
许多玩家不了解这些东西是如何工作的,但是理解永恒的“ WTF为什么我想念它?”至关重要。题。
Tim Holt 2010年

或“为什么我的角色用巨大的橡皮筋绑在那根柱子上?” 在掉线的连接上:)
ggambett 2010年

Valve的Wiki有一篇文章也涉及这些问题。该页面位于developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Tim Holt 2010年

1
我喜欢现场演示。可视化正在发生的事情的好方法。
理查德·马斯克

2

对自己的角色进行全面预测以提高响应能力,并让其他角色落后100ms以保持一致性,这并非没有道理。如果这看起来不好,请考虑使自己的角色稍有滞后,以使其保持同步。无论哪种方式,在滞后尖峰的情况下,您仍将需要校正机制来消除错误的预测,并且该系统将处理您所描述的情况。延迟是100ms还是1ms都没有关系-您的客户端在某种意义上总是处于“延迟”状态,因此必须始终像对待旧数据一样采取行动,并应用诸如插值的修饰效果使其看起来合理。


0

最后,所有关于使用可用网络资源的事情。理想情况下,我们将生活在一个零延迟的世界中,并且所有内容都可以完美同步。实际上,您每隔100、200、300毫秒更新一次客户端,并且在客户端中需要有适当的逻辑以使发生的事情看起来更流畅。“流畅性”非常重要,最终,即使在客户端和服务器之间发生一些混乱的同步,游戏也只需要保持流畅即可。

可以找到一个好的帖子和更好的答案:

如何编写网络游戏?


0

问题实际上不是延迟。可以很好地补偿和预测它,以隐藏引起它的任何问题。数据包丢失也不是问题-网络系统应该写得健壮并且可以容忍数据包丢失。但是,问题是滞后峰值和不可预测的延迟。数据包不同步到达,其中某些数据包仅由于延迟波动而丢失,由于延迟波动无法预测和内插等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.