Я думаю , що це, безумовно , НЕ ОК , щоб synchornize годинник в системі . Користувач не очікує, що ти торкнешся системних налаштувань, і багато систем навіть не дозволять тобі це зробити.
Все, що вам потрібно, це мати кореляцію для перетворення часових позначок з годинника однієї сторони на годинник іншої сторони. З іншого боку, вам потрібно, щоб це співвідношення було досить точним, скажіть принаймні до сотої секунди, якщо ви хочете використовувати його для прогнозування позицій гравців. Системний годинник ніколи не буде так добре співвідноситися між випадковими машинами. Отже, вам слід встановити кореляцію самостійно, використовуючи певну варіацію теми 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 (див. Socket (7), згаданий ott-- у коментарі до питання) був би корисний для відокремлення ефекту затримки циклу подій, який отримує пакети. Чи варто того докладати зусиль, залежить від того, наскільки хороша точність вам потрібна.