我正在使用 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,如果返回的时间确实比预期长,则应用程序会假定连接已断开。 当然,这可能会导致误报。因此应用程序认为连接已断开,但与客户端的连接仍然处于事件状态。应用程序必须能够处理这个问题。
关于ios - 如何更快地检测到对端断线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839887/