Iphone 多人游戏同步
情况: 我想问一下,在使用BT或web服务器的多人1:1游戏中,同步对象的最佳逻辑是什么。游戏有两个玩家,每个人都有多支枪和子弹,子弹是动态创建的,过一段时间就会消失,玩家同时移动我的物体 问题是: 我对同步有一个真正的问题,因为一个设备上的子弹可能比另一个更快,而且它们可能已经离开或击中了一个设备上的物体,而另一个设备上的物体仍然在空中 可能性 在这种情况下,处理同步的最佳方法是什么?所有对象都应该由一个充当服务器的设备控制,而另一个设备只获取值、位置,并且很少思考。或者,控制应该分布在每个设备创建、销毁和移动其自身对象的位置,然后通过同步通知另一个设备 在这种情况下,什么是处理传输延迟的最佳方法,因为BT可能比在网络上播放更快? 最好是一个工作样品-非常感谢 因为一个设备上的子弹可能比另一个更快 如果游戏的架构设计正确,这种情况就不会发生 现在的大多数游戏(尤其是多人游戏)都是在小时间片上运行的。每个系统在计算滴答声期间发生的事情时应该得到完全相同的结果——不,“子弹在一台机器上的移动速度比在另一台机器上快”Iphone 多人游戏同步,iphone,synchronization,multiplayer,Iphone,Synchronization,Multiplayer,情况: 我想问一下,在使用BT或web服务器的多人1:1游戏中,同步对象的最佳逻辑是什么。游戏有两个玩家,每个人都有多支枪和子弹,子弹是动态创建的,过一段时间就会消失,玩家同时移动我的物体 问题是: 我对同步有一个真正的问题,因为一个设备上的子弹可能比另一个更快,而且它们可能已经离开或击中了一个设备上的物体,而另一个设备上的物体仍然在空中 可能性 在这种情况下,处理同步的最佳方法是什么?所有对象都应该由一个充当服务器的设备控制,而另一个设备只获取值、位置,并且很少思考。或者,控制应该分布在每个设
然后,更简单的事情是确保每个系统为每个玩家获得相同的输入(您需要将每个玩家的输入广播给另一个玩家,以及在广播过程中注册的输入标记),并确保每个系统以相同的速率计算滴答声。您似乎已经开始了一些关于同步的好主意,但可能会遇到两个重叠的问题:游戏时钟的同步和游戏状态的同步 (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个对象-如果没有同步调用,它们很容易失去同步。但是,在我的案例中,扩展使用的方法不起作用,因为我