Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 多人游戏同步_Iphone_Synchronization_Multiplayer - Fatal编程技术网

Iphone 多人游戏同步

Iphone 多人游戏同步,iphone,synchronization,multiplayer,Iphone,Synchronization,Multiplayer,情况: 我想问一下,在使用BT或web服务器的多人1:1游戏中,同步对象的最佳逻辑是什么。游戏有两个玩家,每个人都有多支枪和子弹,子弹是动态创建的,过一段时间就会消失,玩家同时移动我的物体 问题是: 我对同步有一个真正的问题,因为一个设备上的子弹可能比另一个更快,而且它们可能已经离开或击中了一个设备上的物体,而另一个设备上的物体仍然在空中 可能性 在这种情况下,处理同步的最佳方法是什么?所有对象都应该由一个充当服务器的设备控制,而另一个设备只获取值、位置,并且很少思考。或者,控制应该分布在每个设

情况:

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

问题是:

我对同步有一个真正的问题,因为一个设备上的子弹可能比另一个更快,而且它们可能已经离开或击中了一个设备上的物体,而另一个设备上的物体仍然在空中

可能性

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

在这种情况下,什么是处理传输延迟的最佳方法,因为BT可能比在网络上播放更快? 最好是一个工作样品-非常感谢

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

如果游戏的架构设计正确,这种情况就不会发生

现在的大多数游戏(尤其是多人游戏)都是在小时间片上运行的。每个系统在计算滴答声期间发生的事情时应该得到完全相同的结果——不,“子弹在一台机器上的移动速度比在另一台机器上快”


然后,更简单的事情是确保每个系统为每个玩家获得相同的输入(您需要将每个玩家的输入广播给另一个玩家,以及在广播过程中注册的输入标记),并确保每个系统以相同的速率计算滴答声。

您似乎已经开始了一些关于同步的好主意,但可能会遇到两个重叠的问题:游戏时钟的同步和游戏状态的同步

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

因此,在权威客户机上:

OnUpdate()
  gameTime = GetClockTime();
  msg.gameTime = gameTime
  SendGameTimeMessage(msg);
在另一个客户端上,可能类似于:

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

OnUpdate()
 gameTime = lastGameTimeFromNetwork + GetClockTime() - lastClockTimeOfGameTimeMessage;
有一些复杂的情况,如跳过/滑倒(即通过网络获得的时间向前/向后移动太多),需要进一步的工作,但希望你能明白这一点。如果需要的话,再问一个问题

注意:此示例没有区分“滴答声”和“秒数”,也没有与您的网络协议或游戏运行的设备类型相关联(请保存“设备具有本地时钟”的要求)

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

异步的

  • 游戏状态的每个单元都由一个进程“拥有”。只有这个过程才允许改变游戏状态。这些更改将传播到所有其他进程
  • 如果所有东西都由一个进程拥有,这通常被称为“客户机/服务器”游戏
  • 请注意,使用此模型,每个客户端在任何时候都有不同的游戏世界视图
  • 示例游戏:地震,魔兽世界
为了优化带宽和隐藏延迟,通常可以对更新频率较高的字段进行一些本地模拟。例如:

drawPosition = lastSyncPostion + (currentTime - lastSyncTime) * lastSyncVelocity
当然,在这种情况下,您必须将新信息与模拟版本协调起来

同步的

  • 每个游戏状态单位在所有进程中都是相同的
  • 来自每个进程的命令都会以其所需的启动时间(将来某个时候)相互传播
  • 在其最简单的形式中,一个进程(通常称为主机)发送特殊消息,指示何时提前游戏时间。当每个人都收到这个信息时,他们就可以模拟游戏到那个时候
  • “未来”需求导致输入命令和游戏状态更改之间的延迟很高
  • 在像《文明》这样的非实时游戏中,这很好。在像《星际争霸》这样的游戏中,通常确认输入的声音会立即出现,但实际上影响动作的游戏状态会延迟。这种风格不适合像射击这样需要时间敏感动作的游戏(在~100ms范围内)
与重模拟同步

  • 每个游戏状态单位在所有进程中都是相同的
  • 每个进程向所有其他进程发送其带有当前时间戳的输入。此外,还会定期发送“未发生任何事情”消息
  • 每个进程有2个游戏状态副本
  • 游戏状态的副本1被传播到它从所有其他客户端接收到的“最后最早消息”。这相当于同步模型,但有一个缺点,它代表了“一点以前”的游戏状态
  • 游戏状态的副本2是副本1加上所有剩余的消息。它是对客户端当前游戏状态的预测,假设没有新的事情发生
  • 玩家与两种游戏状态的某种组合进行交互(理想情况下为100%副本2,但必须考虑避免新消息传入时出现POP)
  • 示例游戏:街头斗士4(网络游戏)

根据您的描述,选项(1)和(3)似乎适合您的问题。同样,如果您还有其他问题或需要更多详细信息,请询问后续信息。

有关更多详细信息,请查看此帖子:-

…不幸的是,使用记号并不能消除同步的要求。即使是GKTank和punchball这两个示例也会同步它们的2个对象-如果没有同步调用,它们很容易失去同步。但是,在我的案例中,扩展使用的方法不起作用,因为我