【问题标题】:Game center issue with sending data发送数据的游戏中心问题
【发布时间】:2013-07-08 18:50:49
【问题描述】:

我正在开发一款使用 Game Center 的 iOS 多人游戏。

当用户登录 Game Center 并点击“立即玩”时,GC 连接 4 名玩家并开始游戏。问题是游戏经常因为一些数据丢失而死机(我认为这是原因)。游戏通常可以正常运行,但有时服务器发送的数据(服务器是一些玩家)会丢失并且游戏冻结。

我使用这个函数来发送数据:

- (void)sendDataNSData *)data {
    NSError *error;

    BOOL success = [[GCHelper sharedInstance].match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable errorerror];

    if (!success) {

        //NSLog(@"Error sending init packet");
        [self matchEnded];

    }
}

问题是 matchend 没有被调用,所以我相信数据已发送但它丢失了。

有没有人有类似的问题并知道如何解决?

【问题讨论】:

  • 错误参数呢?
  • @Mert - 没有错误。有时客户端在没有警告的情况下不会收到数据包。
  • 你用模拟器还是idevice? Game Center api 在模拟器上无法正常工作。
  • @Mert - 我正在使用真实设备。
  • 如果通过 UDP 发送,可能会丢失数据包。您可能需要在 GC 之上构建自己的确认协议?

标签: iphone game-center


【解决方案1】:

我的用户还抱怨在游戏过程中可能会意外丢失一些数据。我写了一个test app 并发现GKMatchSendDataReliable 并不可靠。在弱互联网连接(例如 EDGE)上,一些数据包经常丢失,而 Game Center API 没有任何错误。

因此,唯一的选择是添加额外的传输层以实现真正可靠的交付。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多