我正在使用Multipeer Connectivity框架制作回合制多人游戏。
当一个对等体因任何原因断开连接时,我希望该播放器被AI替换。这样,游戏可以继续为其余的玩家。
要做到这一点,我显然需要检测播放器何时断开连接。我知道我可以通过在session(_ :peer:didChange:)
中实现MCSessionDelegate
来做到这一点:
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
if state == .notConnected {
// someone has disconnected, handle this...
}
}
问题是,这个方法只在玩家实际断开连接后调用一段时间(几秒钟)。
让其他玩家等待几秒钟对我来说似乎是糟糕的用户体验,所以我希望尽快调用session(_ :peer:didChange:)
方法。
我知道我可以在viewDidDisappear
向所有连接的同伴发送信号,表示该玩家已退出游戏。但这仅处理一种情况 - 当viewDidDisappear
被召唤时。还有许多其他方式可以断开游戏,例如移动到蓝牙范围之外,打开飞机模式,甚至他们的应用程序崩溃。
那么,在一天结束时,涉及网络层并且可能存在一些延迟。你不会对方法session(_ :peer:didChange:)
有任何影响。
在我看来,你只能发送一个常规ping,如果这确实返回的时间超过了预期,那么应用程序会认为连接已经死亡。当然,这可能导致误报。所以应用程序认为连接已经死亡,但与客户端的连接仍然是活动的。然后,应用程序必须能够处理此问题。