Как я могу обнаружить отключение пира быстрее? - PullRequest
0 голосов
/ 23 февраля 2019

Я делаю пошаговую многопользовательскую игру с использованием фреймворка Multipeer Connectivity .

Когда пир отключается по какой-либо причине, я хочу, чтобы этот игрок был заменен ИИ.Таким образом, игра может продолжаться для остальных игроков.

Чтобы сделать это, мне, очевидно, нужно определить, когда игрок отключился.Я знаю, что могу сделать это, внедрив session(_ :peer:didChange:) в MCSessionDelegate:

func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {        
    if state == .notConnected {
        // someone has disconnected, handle this...
    }
}

Проблема в том, что этот метод вызывается только через некоторое время (несколько секунд) после того, как игрок фактически отключился.

То, что другие игроки ждут несколько секунд, кажется мне плохим UX, поэтому я хочу, чтобы метод session(_ :peer:didChange:) вызывался как можно скорее.

Я знаю, что могу послать сигналв viewDidDisappear для всех подключенных пиров, сигнализируя, что этот игрок вышел из игры.Но это обрабатывает только одну ситуацию - когда вызывается viewDidDisappear.Существует множество других способов отсоединения от игры, например выход за пределы диапазона Bluetooth, включение режима полета или даже сбой приложения.

1 Ответ

0 голосов
/ 23 февраля 2019

Ну, в конце концов, сетевой уровень задействован, и могут быть некоторые задержки.Вы не будете иметь никакого влияния на метод session(_ :peer:didChange:).

. По моему мнению, вы можете отправить только один обычный пинг, и если он вернется дольше, чем ожидалось, приложение предполагает, что соединение не работает.Конечно, это может привести к ложным срабатываниям.Таким образом, приложение считает, что соединение не работает, но соединение с клиентом все еще активно.Приложение должно быть в состоянии справиться с этим.

...