【问题标题】:Network latency on a multiplayer mobile game多人手机游戏的网络延迟
【发布时间】:2012-03-05 08:41:40
【问题描述】:

我们正在使用 Corona SDK 及其物理引擎沿某种景观(例如 Tiny Wings)移动对象,我们有一个关于位置校正的问题。假设一个盒子沿着连绵起伏的丘陵行进,但它的位置是在另一个设备上计算的。每秒几次,您会收到:

  • 更新的位置
  • 盒子的速度
  • 发送信息的时间

所以我们知道该信息已有 X 毫秒的历史,并且想知道它现在应该在哪里(假设它受到物理影响)并继续模拟,直到我们得到另一个更新。 现在,我们尝试简单地将速度乘以自包裹发送以来的时间量,但正如您可以想象的那样,如果地形弯曲/不平坦,这会表现得非常糟糕。

有没有办法说:“停止一切,给我这个盒子在 X 毫秒内物理作用于它的位置,然后恢复游戏”而不实际停止所有游戏 X 毫秒?

【问题讨论】:

  • 不清楚你在问什么。 “停止一切”是什么意思?
  • 我推荐gafferongames.com/game-physics/networked-physics,尤其是cmets中点对点网络物理的讨论
  • 是的,您可以进行仔​​细的物理模拟,根据 X 毫秒前的状态确定盒子现在可能在哪里,并显示出来。您可以随着时间的推移扩展模拟,并在有更新时对其进行调整。这是否回答了您的问题,还是您需要更多?
  • @user964625 你解决了吗?答案有帮助吗?

标签: networking mobile physics coronasdk multiplayer


【解决方案1】:

我不了解 Corona SDK,但可以做到这一点的一种方法是在每个游戏循环的游戏循环期间模拟你的物理世界。当您收到真实位置时,您可以更新您的物理世界。

一些物理引擎可能无法正确模拟更大的持续时间,因此建议执行更多的小步骤而不是大步骤。因此,在您的情况下,每次迭代不要执行 X ms,而是执行更小的步骤,这样您就可以获得非常准确的模拟。

这里的另一件事是,当您收到实际更新时,盒子的移动可能会出现跳跃,因此您可能需要在几个游戏循环中使其平滑。

【讨论】:

    【解决方案2】:

    你在 20 个月前问过这个问题,你可能已经解决了这个问题,但我会试着为未来的访客回答这个问题:

    没有最好的方法来解决这个问题,总是有正确性-延迟权衡,但以下是一些关于它的想法。

    原则上网络物理和网络游戏逻辑没有区别,都是网络同步。我们可以尝试将其抽象为表示存在所有对等方都应同意的事件(空间+时间+状态)。该事件可能是由物理引擎或其他任何东西计算的特定对象状态。

    您描述了您的数据包在事件启动时包含特定的位置和速度(状态)以及时间戳。每个对等点告诉其他对等点(直接或通过服务器)它的 当前 状态是什么。

    有一种更好的同步方法(在我看来):对等点不应该告诉它当前的状态是什么,而是告诉它希望一个对象在 未来有 X 毫秒的状态强>。

    引擎应尽量使 X 尽可能接近以下各项之和:

    • 客户端之间的观察到的延迟
    • 一点插值时间
    • 一点安全边际

    注意:它可以通过不断发送消息并分析响应时间来找到观察到的延迟

    如果延迟突然变得更糟并且安全边际不够,那么游戏会短暂放缓,直到 X 被适应。

    模拟回合是交错的,每个事件都会提前宣布,这样每个客户都可以收到它,将其添加到其时间线,然后插值和解析 时机成熟时。

    第X毫秒落入的模拟转弯可以称为目标转弯。

    (未来的读者:请注意,模拟转弯通常与 FPS 不同,通常它们的频率要低得多,例如每 10 帧或每 100 毫秒或 我最喜欢这个网络可以提供)

    例子:

    [Turn0] a client/physicsengine announces event e1
    [Turn1] a client/physicsengine announces event e2
    [Turn2] (other stuff)
    [Turn3] (other stuff)
    [Turn4] (other stuff)
    [Turn5] clients start interpolating towards e1
    [Turn6] clients start interpolating towards e2
    [Turn7] e1 target-turn: e1 should be true/fulfilled now
    [Turn8] e2 target-turn: e2 should be true/fulfilled now
    [Turn9] 
    

    如果两个客户不同意某个事件将是什么,该怎么办?首先请注意,每个客户都可以独立检测到这一点,因为每个客户都有一个时间线,在该时间线在到达之前会变得一致。要做什么取决于您的应用以及它是什么类型的事件:

    • 有许多事件没有游戏效果,例如如果你的物理引擎计算出的东西只是为了更好的图形。那些事件可以被遗忘。
    • 对于其他事件,只要两个客户都同意,是否满足一个或另一个版本并不重要。客户端可以基于一些启发式去中心化选择版本(无需通信)。
    • 在其他情况下,可能会发生事件 A 使事件 B 无效,而 B 使事件 A 无效:在这种情况下,您可以让服务器决定并重新安排未来 X 毫秒。

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2012-01-19
      • 1970-01-01
      相关资源
      最近更新 更多