多人游戏同步

时间:2011-01-07 01:33:07

标签: iphone synchronization multiplayer

情况:

我想问一下,使用BT或网络服务器在多人1:1游戏中同步对象的最佳逻辑是什么。游戏中有两个玩家,每个玩家都有多个枪支和玩家。子弹,子弹是动态创建的并且在一段时间后消失,我的移动玩家同时移动物体。

问题:

我有一个真正的同步问题,因为一个设备上的子弹可能比其他设备更快,也可能已经在一个设备上移动或击中一个对象,而另一个设备上仍然在空中。

可能性?

在这种情况下处理同步的最佳方法是什么?如果所有对象都由一个充当服务器的设备控制,而另一个设备只能获取值,位置并且很少考虑。或者应该控制分布在每个设备创建的位置,销毁并移动自己的对象,然后通过同步告诉其他设备。

在这方面处理传输延迟的最佳方法是什么,因为BT可能比通过网络播放更快? 最好的是一个工作样本 - 非常感谢!

3 个答案:

答案 0 :(得分:10)

你似乎已经开始谈论有关同步的一些好主意,但是你可能遇到两个重叠的问题:游戏时钟的同步和游戏状态的同步。

(1)同步游戏时钟 你需要为你的游戏代表“游戏时间”。对于2人游戏,简单地宣布一个权威是非常合理的。

所以在权威客户端:

OnUpdate()
  gameTime = GetClockTime();
  msg.gameTime = gameTime
  SendGameTimeMessage(msg);
另一个客户端上的

可能是这样的:

OnReceivGameTimeeMessage(msg)
 lastGameTimeFromNetwork = msg.gameTime;
 lastClockTimeOfGameTimeMessage = GetClockTime();

OnUpdate()
 gameTime = lastGameTimeFromNetwork + GetClockTime() - lastClockTimeOfGameTimeMessage;

有一些复杂功能,例如跳过/滑倒(即通过网络向前/向后过多的时间)需要进一步的工作,但希望你能得到这个想法。如果需要,请跟进另一个问题。

注意:此示例不区分“ticks”与“秒”,也不区分您的网络协议或游戏运行的设备类型(保存要求'设备有本地时钟')

(2)同步游戏状态 在拥有一致的游戏时钟之后,您仍然需要弄清楚如何持续模拟和传播您的游戏状态。为了同步游戏状态,你有几个选择:

异步

  • 每个游戏状态单元由一个进程“拥有”。只允许该进程更改该游戏状态。这些更改将传播到所有其他进程。
  • 如果所有内容都由一个进程拥有,则通常称为“客户端/服务器”游戏。
  • 请注意,使用此模型,每个客户端都可以随时查看游戏世界的不同视图。
  • 示例游戏:地震,魔兽世界

为了优化带宽和隐藏延迟,您通常可以对具有高更新频率的字段进行一些本地模拟。例如:

drawPosition = lastSyncPostion + (currentTime - lastSyncTime) * lastSyncVelocity

当然,在这种情况下,您必须与模拟版本协调新信息。

同步

  • 游戏状态的每个单元在所有过程中都是相同的。
  • 来自每个进程的
  • 命令以其期望的启动时间(将来的某个时间)彼此传播。
  • 以其最简单的形式,一个进程(通常称为主机)发送特殊消息,指示何时推进游戏时间。当每个人收到该消息时,他们可以在此之前模拟游戏。
  • '未来'要求会导致输入命令和游戏状态更改之间的高延迟。
  • 在像文明这样的非实时游戏中,这很好。在像星际争霸一样的游戏中,通常声音确认输入会立即出现,但影响动作的实际游戏状态会延迟。这种风格不适合需要时间敏感动作的射击游戏(约100毫米)。

与resimulation同步

  • 游戏状态的每个单元在所有过程中都是相同的。
  • 每个进程使用其当前时间戳向其所有其他进程发送其输入。此外,还会定期发送“未发生”消息。
  • 每个进程都有2个游戏状态副本。
  • 游戏状态的副本1传播到它从所有其他客户端收到的“最早的最早消息”。这相当于同步模型,但它有一个弱点,即它代表了一段时间以来的游戏状态。
  • 游戏状态的副本2是副本1加上所有剩余的消息。假设没有新的事情发生,它是对客户端当前时间的游戏状态的预测。
  • 玩家与两个游戏状态的某些组合进行交互(理想情况下,100%副本2,但必须采取一些措施以避免在新消息进入时弹出)
  • 示例游戏:街头霸王4(网络游戏)

从您的描述中,选项(1)和(3)似乎适合您的问题。如果您还有其他问题或需要更多细节,请再次询问。

答案 1 :(得分:1)

  

因为一个设备上的子弹可能比其他设备更快

如果游戏设计得当,这不应该发生。

这些天的大多数游戏(特别是多人游戏)都在 ticks 上工作 - 小时候。每个系统在计算勾选期间发生的事情时应该得到完全相同的结果 - 没有“子弹在一台机器上移动得比在另一台机器上移动得快”。

然后,确保每个系统为每个玩家获得相同的输入(您需要将每个玩家的输入广播到每个其他玩家,以及输入在其中注册的标记),并且确保它是一个更简单的问题。每个系统以相同的速率计算滴答。

答案 2 :(得分:0)

了解更多详情,请查看此帖: - Synchronization in multiplayer networked game?