最近将一个多人游戏功能发放了。GameKit、对等对抗,没什么特别的东西。它在模拟器里工作正常。它在两个设备在同一房间里也工作正常。就发放了。
马上就收到了报告:“我可以在大厅里看到我的朋友,但是当我们点击“开始游戏”,什么也不会发生。”
打开我所有的日志。两个设备都在调用 findMatch(for:)。两个设备都在将request.recipients设置为GKPlayer。当时的设置是对方的数据。两个设备都卡住了。
花了我很多时间才意识到:当你为请求设置了接受方时,GameKit就会发送一份邀请给这些玩家。于是,它会等待玩家接受邀请。
两个设备都发送了一份邀请给对方。也都在等待对方的回应。当看到另一个回应时,因为也在卡死于自己的findMatch调用里,无法接受的回应。
标准的死锁。两个礼貌的人,互相让通行也无法过去。
事后回看,这种解决方法相当尴尬:完全不使用request.recipients。从大厅ID中派生出一个与另一方的玩家组。让两边通过GameKit自动生成匹配。没有邀请,没有互相等待,没有死锁。
房间里的问题:
要知道,最明显死锁的、在事后我们才明白的,多线程/网络bug里遇到的问题是什么?我想通过你们的话来感觉自己好一点。
评论 (0)