4

我已经搜索并阅读了许多文章并查看了 GKTank 苹果示例(看不到有关我的问题的任何细节,似乎在事件发生时对其进行处理)但我看不到似乎可以回答以下问题的示例或教程

在通过蓝牙/互联网(可能)进行的多人游戏中,您如何同步玩家交互,以便在考虑延迟等的情况下产生正确的游戏结果......

例如:

在通过蓝牙连接的两个独立设备上,每个播放器 A 和 B 都会显示一个按钮

玩家 A 按下按钮(玩家 A 正在主持游戏,因此延迟不是问题)玩家 B 在玩家 A 之前按下按钮,但他与玩家 A 设备的连接至少有 200 毫秒的网络延迟

问题:游戏需要知道玩家 B 先被按下,即使玩家 A 的触摸请求会先到达游戏代码 - 即对主机玩家没有任何优势。

我知道触摸事件有时间戳,所以我可以确保按下的实际时间从玩家 B 发送到游戏代码......但不确定这是否是正确的方法,以及它是否是从那里去的地方。 .

我希望答案在于某个游戏时间周期,其中触摸不会立即处理,而是在一个游戏周期内......

对此的任何帮助或指向教程或处理此问题的特定源代码的指针将不胜感激。

亚当

4

2 回答 2

2

您可能想在https://gamedev.stackexchange.com/上问这个问题,因为这是关于多人游戏延迟或延迟的一般问题,而不是特别针对 iPhone。

您也许可以使用时间戳对操作消息进行排序。我认为 iPhone 与 AT&T 维护的日期时间服务器同步。

于 2011-01-12T15:05:31.380 回答
1

好吧,我没有创建多人游戏的实际经验。但就像大多数游戏开发问题一样,我想没有对错之分,所以一些逻辑思维应该可以解决问题。

以下是您可能需要考虑的一些想法:

  • 即使玩家 A 的设备没有发生延迟,您也必须引入一些延迟来补偿玩家 B(反之亦然,因为从玩家 B 的角度来看,玩家 A 也迟到了)
  • 因此,您需要引入某种“命令堆栈”来缓冲来自两个玩家的输入,并在两个玩家有机会在游戏时间的给定点贡献他们的输入时执行命令
  • 您可能需要不时引入 ping 命令来测量实际延迟
  • 只有一个设备(主机)应该测量延迟并将其公布给客户端
  • 根据测量的延迟,计算堆栈中命令的时间偏移(相对于主机时间)或延迟(使用延迟将玩家 B 的时间戳转换为“本地”时间)
  • 如果可能,保持延迟动态,以补偿变化的延迟(在整个会话期间不断测量延迟
  • 如果实际延迟峰值超出计算值,则来自玩家 B 的命令可能会延迟放入堆栈 - 确保它们无论如何都会被执行(此时可能会遇到延迟)
  • 您实际上需要两个“层”——输入层,它交换、缓冲和同步实际输入,以及一个游戏层,它接收来自输入层的延迟命令

到目前为止,我的 2 美分 ;-)

于 2011-01-12T15:05:52.903 回答