Как получить точную синхронизацию часов при одноранговом взаимодействии с GKSession?

Я сделал простую игру, которая подключается к другим узлам с помощью GKSession из GameKit. Настроить было несложно, но я обнаружил некоторые проблемы:

  • Задержка сильно различается. Иногда сообщение приходит мгновенно на другие устройства. Иногда задержка для отправки данных другим одноранговым узлам составляет> 1 секунды. Данные - это всего лишь строка из 10 символов.

  • Моя игра зависит от точной синхронизации часов. В игре играет музыка, и это звучит странно, когда она не запускается одновременно на всех подключенных устройствах.

Я не смог найти в документации ничего о том, как снимать хронометраж. Проблема в том, что "главный" пирс, который запускает игру, немедленно начинает воспроизводить музыку, а затем все остальные пирсы получают сообщение немного позже и, таким образом, начинают воспроизведение после задержки.

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

Существует ли платформа с открытым исходным кодом, которая делает одноранговую и синхронизацию более надежной и простой в использовании на iOS?


person openfrog    schedule 18.11.2012    source источник
comment
На iOS наиболее точным способом получения синхронизации часов является GPS. Но это не то, что вам нужно.   -  person Sentinel    schedule 02.11.2016


Ответы (1)


К сожалению, здесь вас ждет целый мир боли. Очень сложно выполнить точную синхронизацию часов через сетевой интерфейс. Здесь вам нужно, чтобы ваши устройства синхронизировались с точностью до 20 мс.

Я бы порекомендовал сделать следующее: отправить пачку пакетов ping с интервалом 50 мс, заставить клиента немедленно ответить. Возьмите среднее из этого, чтобы получить среднее время приема-передачи (RTT), а затем уменьшите его вдвое, чтобы оценить одностороннюю задержку. Затем отправьте сообщение «start clock» и вращайте в цикле, пока вы не дождетесь своей односторонней задержки и не начнете проигрывать музыку на своем конце. Клиент должен проигрывать свою музыку сразу после получения "стартовых часов".

Здесь описано более надежное решение для долгосрочной синхронизации: http://en.wikipedia.org/wiki/Precision_Time_Protocol

person Mark Pauley    schedule 05.12.2012
comment
На случай, если кто-нибудь увидит это в будущем: Ableton создал для этого отличную (LGPLv2) библиотеку под названием Link. Если бы я сегодня порекомендовал библиотеку, я бы порекомендовал это. ableton.com/en/link - person Mark Pauley; 29.09.2016