Я добавляю сетевой мультиплеер в игру, которую я сделал. Когда сервер отправляет пакет обновления клиенту, я включаю временную метку, чтобы клиент точно знал, когда эта информация действительна. Тем не менее, серверный компьютер и клиентский компьютер могут устанавливать свои часы в разное время (возможно, даже разницу в несколько секунд), поэтому временная метка с сервера должна быть переведена в локальное время клиента.Измерение разницы во времени между сетевыми устройствами
Итак, я хотел бы узнать лучший способ рассчитать разницу во времени между сервером и клиентом. В настоящее время клиент пингует сервер для отметки времени во время инициализации, принимает к сведению, когда запрос был отправлен, и когда был дан ответ, и предположил, что отметка времени была сформирована примерно наполовину в пути. Клиент также выполняет 10 из этих испытаний и принимает среднее значение.
Но проблема в том, что я получаю разные результаты за повторные прогоны программы. В каждом наборе из 10 каждое измерение редко расходится более чем на 400 миллисекунд, что может быть приемлемым. Но если я жду несколько минут между каждым прогоном программы, то итоговые средние могут не согласиться на целых 2 секунды, что неприемлемо.
Есть ли лучший способ выяснить разницу между часами двух сетевых устройств? Или есть, по крайней мере, способ настроить мой алгоритм для получения более точных результатов?
Сведения, которые могут быть важны или не могут быть релевантными: устройства iPod Touches обмениваются данными по Bluetooth. Я измеряю пинг в любом месте от 50-200 миллисекунд. Я не могу попросить пользователей синхронизировать их часы. :)
Обновление: Используя приведенные ниже ответы, я написал класс цели-c, чтобы справиться с этим. Я разместил его в своем блоге: http://scooops.blogspot.com/2010/09/timesync-was-time-sink.html
Ничего себе! Благодаря! Это именно то, что я ищу. Мне еще не совсем ясно, почему это лучше, чем мой оригинальный метод (хотя я считаю, что это так), но я отправлю туда, когда я попробую. Я не думаю, что мне нужно будет настроить d на игровой сессии, но мне не составит труда сделать это, если мне нужно. Еще раз спасибо! – whooops
Это сработало очень хорошо. Я обнаружил, что если я всегда принимаю наименьшие (т. Е. Самые отрицательные) значения t1 и t2, это то же самое, что и самые маленькие пинги, поэтому он сходится на правильном смещении. Я t1 = клиент штамп - сервер штамп и t2 = печать сервер - клиент марка Кроме того, я обнаружил, что Iphones дрейфуют довольно значительно! В течение получаса фактическое смещение между двумя устройствами может меняться на полсекунды. Я проверил это с часовыми программами, которые связывают NTP-серверы. – whooops
Рад, что это было полезно для вас. –