Я думаю, что это определенно не нормально синхронизировать часы в системе . Пользователь не ожидает, что вы коснетесь системных настроек, и многие системы даже не позволят вам это сделать.
Все, что вам нужно, это иметь корреляцию для преобразования метки времени из часов одной стороны в часы другой стороны. С другой стороны, вам нужно, чтобы это соотношение было достаточно точным, скажем, по крайней мере с сотой доли секунды, если вы хотите использовать его для прогнозирования позиций игрока. Системные часы никогда не будут так хорошо коррелированы между случайными машинами. Таким образом, вы должны установить корреляцию самостоятельно, используя некоторые вариации на тему NTP , возможно, встроенные в другие ваши сообщения, чтобы сохранить пропускную способность сети.
Основная идея может заключаться в том, что для каждого пакета, который вы отправили, вы отправили метку времени, порядковый номер и метку времени, когда вы получили последний пакет с другой стороны. Исходя из этого, вы вычисляете туда и обратно: например, если пакет Q говорит, что он был отправлен в 1000, а пакет P был получен в 500, чем, если вы отправили пакет P в 0 и получаете Q в 800, обратное путешествие равно (800 - 0 ) - (1000 - 500) = 300. Нет возможности узнать ассиметрию, поэтому вы просто предполагаете, что пакет занимает половину (150) тактов в любом направлении. И эта удаленная временная метка опережает локальную на 1000 - (800 - 150) = 350 тиков. В оба конца будет меняться. Если вы предполагаете, что часы достаточно точны, вы должны использовать долгосрочное среднее значение корреляции.
Обратите внимание, что вы не хотите использовать системные часы для часов. Они могут быть повторно синхронизированы на полпути, сбивая вас с пути. Вы должны использовать clock(CLOCK_MONOTONIC)
в Unix или GetTickCount
в Windows (не знаю, как эти API обернуты сейчас в Java или Python).
Примечание. Параметр SO_TIMESTAMP
сокета (см. Socket (7), упомянутый ott-- в комментарии к вопросу) будет полезен для выделения эффекта задержки цикла обработки событий, который получает пакеты. Стоит ли это усилий, зависит от того, насколько хорошая точность вам нужна.