如何更快地检测到对等体的断开?

问题描述 投票:0回答:1

我正在使用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被召唤时。还有许多其他方式可以断开游戏,例如移动到蓝牙范围之外,打开飞机模式,甚至他们的应用程序崩溃。

ios swift multipeer-connectivity
1个回答
0
投票

那么,在一天结束时,涉及网络层并且可能存在一些延迟。你不会对方法session(_ :peer:didChange:)有任何影响。

在我看来,你只能发送一个常规ping,如果这确实返回的时间超过了预期,那么应用程序会认为连接已经死亡。当然,这可能导致误报。所以应用程序认为连接已经死亡,但与客户端的连接仍然是活动的。然后,应用程序必须能够处理此问题。

© www.soinside.com 2019 - 2024. All rights reserved.