Измерение разницы во времени между сетевыми устройствами

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

Итак, я бы хотел чтобы узнать, как лучше всего рассчитать разницу во времени между сервером и клиентом. В настоящее время клиент проверяет сервер на наличие отметки времени во время инициализации, отмечает, когда запрос был отправлен и когда на него был дан ответ, и предполагает, что отметка времени была сгенерирована примерно на полпути. Клиент также запускает 10 из этих проб и принимает среднее значение.

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

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

Подробности, которые могут иметь или не иметь отношения: Устройства - это iPod Touch, которые обмениваются данными по Bluetooth. Я измеряю пинги от 50 до 200 миллисекунд. Я не могу просить пользователей синхронизировать свои часы. :)


Обновление: с помощью приведенных ниже ответов я написал класс objective-c для решения этой проблемы. Я разместил это в своем блоге: http://scooops.blogspot.com/2010/09/timesync-was-time-sink.html

14
задан whooops 21 September 2010 в 21:30
поделиться