Подтвердить что ты не робот

Является ли связь GameKit надежной с GKMatchSendDataReliable?

Я работаю с GameKit.framework, и я пытаюсь создать надежную связь между двумя iPhone'ами.

Я отправляю пакеты с режимом GKMatchSendDataReliable.

В документации написано:

GKMatchSendDataReliable

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

     

Доступен в iOS 4.1 и более поздних версиях. Объявлено в GKMatch.h.

У меня возникли некоторые проблемы с плохим подключением WiFi. GameKit не объявляет потерянное соединение, но некоторые пакеты так и не приходят.

Можно ли рассчитывать на 100% надежную связь при использовании GKMatchSendDataReliable или Apple просто использует причудливые имена для чего-то, чего они не реализовали?

4b9b3361

Ответ 1

Мои пользователи также жалуются, что некоторые данные могут быть случайно потеряны во время игры. Я написал тестовое приложение и понял, что GKMatchSendDataReliable не очень надежный. При слабом подключении к Интернету (например, EDGE) некоторые пакеты регулярно теряются без ошибок в API Game Center.

Таким образом, единственный вариант - добавить дополнительный транспортный уровень для действительно надежной доставки.

Я написал для этого простой lib: RoUTP. Он сохраняет все отправленные сообщения до тех пор, пока не будет получено подтверждение для каждого полученного, отправленного сообщения об утере и буферов полученных сообщений в случае нарушения последовательности. В моих тестах комбинация "RoUTP + GKMatchSendDataUnreliable" работает даже быстрее, чем "RoUTP + GKMatchSendDataReliable" (и, конечно, лучше, чем чистый GKMatchSendDataReliable, который не очень надежный).

Ответ 2

Он почти на 100% надежный, но, возможно, не тот, который вам нужен иногда... Например, вы вышли из сети, все материалы, которые вы отправляете через GKMatchSendDataReliable, будут отправлены в том порядке, в котором вы их отправили. Например, это блестящий вариант для пошаговых игр, но если необходима быстрая реакция, то выпадение сети не просто забудет пропущенные пакеты, которые он получит все поздние пакеты, пока он не вернется в реальное время снова.

Случай GKMatchSendDataReliable не отправляет данные, это время соединения. Я думаю, что это будет так же, когда вы закрываете приложение