我正在开发一款使用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,所以我相信数据已发送但丢失了。
有没有人有类似的问题,知道如何解决它?
答案 0 :(得分:2)
我的用户还抱怨在游戏过程中可能会意外丢失某些数据。我写了test app,并发现GKMatchSendDataReliable
并不可靠。在弱互联网连接(例如EDGE)上,一些数据包经常丢失而没有来自Game Center API的任何错误。
因此,唯一的选择是添加额外的传输层以实现真正可靠的传输。
我为此编写了一个简单的lib:RoUTP。它保存所有已发送的消息,直到确认每个接收到的消息,重新发送丢失并缓冲接收到的消息,以防序列中断。 在我的测试组合中,“RoUTP + GKMatchSendDataUnreliable”甚至比“RoUTP + GKMatchSendDataReliable”更好(当然比纯粹的GKMatchSendDataReliable更好,但这并不可靠)。