gpt4 book ai didi

ios - 当 matchData 发生变化时,GameKit 基于回合的监听器不会被可靠地调用

转载 作者:行者123 更新时间:2023-12-01 18:10:45 24 4
gpt4 key购买 nike

我正在为我的纸牌游戏使用 Game Center 回合制比赛。感觉很合适,因为人们有时想在转弯之间检查他们的电子邮件或写一段文字。一些用户表示他们确实希望能够获得非常异步的播放体验。

对于在回合之间保持游戏开放的人,我想更新屏幕以反射(reflect)其他玩家在回合中所做的事情。我在 GKLocalPlayer 上设置了一个监听器响应 player:receivedTurnEventForMatch:didBecomeActive .文档说,当另一个玩家保存比赛数据时,即使没有轮到玩家(当前设备上的玩家),也会调用它。这似乎不是 100% 的真实情况。事实上,它似乎只有大约三分之一的时间被调用,比赛数据被其他玩家保存。轮到玩家时似乎更可靠,但即使这样也不是 100% 可靠。

我正在使用 saveCurrentTurnWithMatchData:completionHandler:GKTurnBasedMatch保存不会结束当前玩家回合的比赛数据,我正在调用 endTurnWithNextParticipants:turnTimeout:matchData:completionHandler:GKTurnBasedMatch当它结束当前玩家的回合时保存数据。有几种情况我想调用saveCurrentTurn…使用更新的 matchData。在我的游戏中,你也可以让电脑在你的多人游戏中玩。因此,人类玩家可能会打出一张牌,然后计算机可能会在此之前打出一张牌GKPlayer的回合结束。在某些情况下,单个玩家可能会玩两次。 (例如,玩家在一个戏法中打出最后一张牌。该玩家接受了这个戏法并开始领导下一个戏法。)

我已经设置了大量的日志记录,我可以看到一个设备调用 saveCurrentTurn… 的清晰场景。并且在没有错误的情况下调用了完成处理程序,并且其他设备不会通过调用 player:receivedTurnEvent… 得到通知我还添加了日志记录以验证每次调用 saveCurrentTurn…我用新的 matchData 来调用它。我不会打多余的电话。

如果我转到未获取更新 matchData 的设备并强制它再次加载 matchData 以进行匹配,它将获取更新的数据。所以,肯定得救了。

我尝试限制对 saveCurrentTurn… 的调用这样它们就不会立即连续发生,这没有帮助。

我测试的两台设备都运行 iOS 8.4。 iOS 8.3 中似乎存在一个现已修复的问题 (see this question)。 This Apple forum post 2 年前还报告了这个问题,并且似乎已提交错误报告并标记为已修复。

有没有其他人看过这个?我很想知道我做错了什么。任何想法都非常受欢迎。

最佳答案

我做类似的事情。在我的游戏中,每个玩家都有多个棋子,当每个棋子移动时保存比赛,以便其他玩家——如果他们在游戏中——可以实时观看正在发生的事情。就像你描述的那样,Game Center 消息几乎完全没用。

正如您所提到的,在 8.3 中,“回合结束”消息完全被破坏了。从 8.4 开始,它们发生在 最多 ,但不是全部。如您所见,“比赛已保存”通知也不稳定。以下是我用来提高成功率的一些技巧:

  • 减慢保存速度。如果您保存得太快,则只有最后一个到达收件人。我设置了一个 NSArray 队列,每次我想保存比赛时,我都会将新的 matchData 添加到该队列中。我有一个计时器循环正在运行,它执行实际的 saveCurrentTurnWithMatchData ,如果保存成功,则将项目从堆栈中弹出,然后设置一个新的计时器稍后再次调用自己。我正在使用 2 秒的间隔,这似乎运作良好。
  • 追加每条新数据,不要覆盖。在每条数据上放置一个序列号。因此,如果您保存 seq 编号 1、2、3 和 4,但收件人只收到 #4 的通知,则匹配对象中存在 1、2 和 3 的记录。接收者需要跟踪它读取的最后一条记录,然后在接收到更新的 matchData 时从该点开始遍历任何新记录。
  • 我也使用队列的 NSArray writeToFile :用于维护待处理保存列表的功能。如果用户在刷新队列之前退出游戏,我会在下次启动时从磁盘重新加载队列 NSArray
  • 请注意,即使使用此机制,发送给收件人的通知也是不稳定的。一般来说,它们以 4+ 的批处理到达。然后什么都不会发生,直到发生 3 或 4 次以上的保存,这些保存再次一起出现。进行 1 次保存并让游戏等待 10 分钟可能永远不会在接收者的机器上生成通知。但是,如果您连续保存 4 或 6 次,则它们往往都会突然出现。
  • 有时,通知只会停止几个小时。不确定这是沙盒缺陷还是游戏中心的一般缺陷。没有任何类型的故障,消息只是停止工作一段时间。有时,第二天早上,它们会突然出现。有时不是。最后,我不再依赖通知。我设置了另一个计时器循环来不断下载比赛。它检查是否轮到我了,它检查是否已将新更新添加到 matchData。然后调用player:receivedTurnEventForMatch:didBecomeActive .据 receivedTurnEventForMatch : 知道,它是因为一个事件而推出的,它愉快地继续着它的业务。
  • 保存比赛似乎非常迅速。如果您没有收到错误,似乎可以肯定更新的比赛可以立即供其他玩家使用......他们只需要知道使用它。但是,消息传递框架必须被视​​为完全不可靠且没有保证。因此,定时器循环不断地轮询匹配。

  • 编辑:可以说,一旦我实现了#2,#1 就不再重要了。接收者收到的任何通知都会触发读取数据中的所有新记录。但是,随着我与 Game Center 的缺点作斗争,这种“硬化”在过去几个月中已经演变。我只是还没来得及删除#1。

    关于ios - 当 matchData 发生变化时,GameKit 基于回合的监听器不会被可靠地调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31979049/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com