【发布时间】:2013-06-03 23:36:36
【问题描述】:
我在应用程序中成功使用 GKMatch 已经有一段时间了。我一直在追查游戏偶尔会停止的问题,并将其追踪到正在发送但未收到的数据包。这只是偶尔发生,但我似乎无法追查为什么会发生。
所有消息都使用 GKSendDataReliable 发送。
记录显示数据包从一台设备成功发送,但目标设备从未收到。
//Code sample of sending method....
//self.model.match is a GKMatch instance
-(BOOL) sendDataToAllPlayers:(NSData *)data error:(NSError **)error {
[self.model.debugger addToLog:@"GKManager - sending data"];
return [self.model.match sendDataToAllPlayers:data withDataMode:GKSendDataReliable error:error];
}
...
//Code sample of receiving method....
// The match received data sent from the player.
-(void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
[self.model.debugger addToLog:@"GKManager - received data"];
[super didReceiveData:data fromPlayer:playerID];
}
我看到的情况是,“sendDataToAllPlayers”方法会定期(可能 100 条消息中的 1 条)发送而没有错误,但接收设备从未点击“didReceiveData”方法。我的理解是,使用 GKSendDataReliable 应该发送消息,然后在收到确认之前不会发送另一个消息。未收到消息,但从同一设备发送新消息。
发送方法返回 'YES' 并且错误为 nil,但 didReceiveData 从未命中...!
有人见过吗?有谁知道这可能是什么?我不知道我还能做些什么来调试它。
【问题讨论】:
-
我的用户也抱怨在游戏过程中可能会不小心丢失一些数据。但我仍然无法自己重现此错误。您是否有一个示例项目,该错误始终可以重现?如果是的话,你能分享一下吗(可能在github上)?谢谢。
-
我的项目非常大(当前商店中的应用程序处于活动状态),但我会尝试将它的一个较小版本放在一起,看看它是否能够始终如一地重现。
-
我遇到了同样的问题,尤其是当其中一台设备的互联网连接较弱时。 GKSendDataReliable 是否真的会在收到确认之前停止发送消息?
-
您是否为此提交了错误报告?这似乎从根本上破坏了功能,应该会影响任何使用实时匹配的开发人员。
-
我也证实了这一点。 Apple 真的非常令人惊讶(更不用说令人失望了)。可靠模式的重点是连接应该缓冲和延迟,直到它可以发送,而不仅仅是丢弃消息。
标签: ios game-center multiplayer gksession