iOS游戏中心游戏不同步

3
我一直在为iOS构建一个游戏中心游戏,目前运行良好。最近我开始测试游戏,在游戏中出现了明显的延迟,导致游戏不同步。
基本上,我的游戏有两个玩家,每个玩家控制一个游戏角色。游戏角色可以射出火球和冰球等攻击造成伤害,也会引起各种效果。例如,如果冰球碰到对手,对手会被冻结3秒钟;而火球则会让对手持续受到火焰伤害3秒钟。
问题就在于,当我和我兄弟进行游戏时,由于延迟的原因,我的游戏显示我还剩下40点生命值,而他已经输到0点;而在他的设备上,游戏显示我的生命值为0,他的生命值却还剩下20点。
这意味着攻击在一台设备上(根据角色/火球的位置)得到了注册/碰撞,但在另一台设备上没有得到注册/碰撞,反之亦然。
我目前正在使用默认的点对点游戏中心架构。使用客户端-服务器架构(即一个人成为服务器)是否能解决这个不同步的问题?
如果不行,那么在游戏工具包API中还有什么其他选择呢?

你正在使用TCP还是UDP连接? - Jiri Trecak
@JiriTrecak 不太确定。让我再确认一下。 - Abdul Ahmad
@JiriTrecak 我认为它使用的是TCP。使用UDP会让数据传输更快吗? - Abdul Ahmad
1个回答

1
我已经找到了解决这个问题的方法。
注意:这将是一个相对较长的答案。
我实现的一件事是在某些数据传输中使用udp,这些传输不如其他传输那么关键。例如,由于我每秒发送大约10次的运动数据,所以我认为如果偶尔有1或2条数据丢失,那么没关系。
现在来谈实际问题:
因为我使用了一种点对点的架构,所以当两个客户端看到游戏“世界”时都会有延迟。这意味着在我的设备上,我看到敌方玩家的位置有100-200毫秒的延迟(所以他实际上是在100-200毫秒之前出现的)。
问题在于,当我向敌人射击一个抛射物并看到碰撞时,如果碰撞发生在他的精灵边缘(他的脚或头),那么在他的屏幕上,他已经超过了那个位置——再加上——我的火球在他的屏幕上也会有100毫秒的延迟。这意味着在他的设备上,他可以躲避我的攻击。这可能会发生随机次数,但我猜测它可能低于30%的时间。70%的时间,两个设备都能看到碰撞。

解决方案


我想到的解决方法是,当两个设备中任意一个看到碰撞时,向另一个玩家发送消息。请记住,每个设备都不知道另一个设备是否看到了碰撞。因此,我无法知道两个设备是否都看到了碰撞,或者只有一个设备看到了攻击被闪避的情况。
这意味着每次发生碰撞时,我都必须向另一个玩家发送消息。因为我设计游戏的方式,当发送碰撞时,我会自动应用碰撞事件(即造成伤害、投射物效果发生,例如冰霜箭头冻结与之碰撞的玩家)。这是有问题的,因为如果两个设备都看到了碰撞,那么两个设备都会向对方发送碰撞消息,并再次应用碰撞。
为了解决这个问题,我为每种法术/攻击添加了一个“法术编号”,当发生碰撞时,我将该编号保存在发生碰撞的玩家身上,作为“上一次碰撞的法术编号”。因此,如果该法术导致碰撞,玩家就知道他/她已经与该特定对象发生过碰撞,因此碰撞逻辑不会运行两次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接