1

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

当用户登录游戏中心并点击“立即玩”时,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 没有被调用,所以我相信数据已发送但它丢失了。

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

4

1 回答 1

2

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

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

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

于 2013-07-08T10:50:49.120 回答