GameKit的通信在使用GKMatchSendDataReliable时是否可靠?

12
我正在使用GameKit.framework并尝试在两台iPhone之间创建可靠的通信。
我使用GKMatchSendDataReliable模式发送数据包。
文档说明如下:

GKMatchSendDataReliable

数据持续发送,直到被预期接收者成功接收或连接超时。可靠传输按照它们发送的顺序传递。当您需要保证交付时,请使用此选项。

在iOS 4.1及更高版本中提供。在GKMatch.h中声明。

我在WiFi连接不好的情况下遇到了一些问题。 GameKit没有声明连接丢失,但某些数据包从未到达。
当使用GKMatchSendDataReliable时,我能否依赖100%可靠的通信,还是苹果只是为他们没有实现的东西使用花哨的名称?

我从未使用过可靠模式,但在模拟器上测试GC应用程序时遇到了许多问题。请确保您在两个设备上测试您的应用程序。 - Adam
2个回答

1
我的用户也抱怨说在游戏过程中可能会意外丢失一些数据。我编写了一个test app,发现GKMatchSendDataReliable并不是真正可靠的。在弱网络连接(例如EDGE)下,一些数据包经常会丢失,而Game Center API没有任何错误提示。

因此,唯一的选择是添加一个额外的传输层来实现真正可靠的传递。

我为此编写了一个简单的库:RoUTP。它保存所有发送的消息,直到每个接收到的消息都得到确认,重新发送丢失的消息,并在序列损坏的情况下缓冲接收到的消息。在我的测试中,"RoUTP + GKMatchSendDataUnreliable"的组合甚至比"RoUTP + GKMatchSendDataReliable"(当然也比纯粹的GKMatchSendDataReliable更可靠)表现更好。


2
我已经收集到了与你相符的证据。我不得不承认,这让我感到非常惊讶,更何况对苹果公司也非常失望。我的意思是,他们那可靠的连接居然如此明显地不可靠?我必须在游戏层之上添加一个传输层,而这个游戏层又位于多个传输层之上?接下来,我们要在应用程序中开始编写一些硬件流控制吗?真是该死的。 - theLastNightTrain

0

它几乎是100%可靠的,但有时可能不是您所需要的...例如,如果您从网络中掉出来,通过GKMatchSendDataReliable发送的所有内容都将按照您发送它们的顺序发送。 这对于回合制游戏非常棒,但如果需要快速反应,则网络掉线不仅会忘记丢失的数据包,而且会一直获取到实时为止的所有延迟数据包。

GKMatchSendDataReliable未发送数据的情况是连接超时。 我认为当您关闭应用程序时也会出现这种情况。


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