Penso che sia not OK a sincronizzare l'orologio nel sistema . L'utente non si aspetta che tu tocchi le impostazioni di sistema e molti sistemi non ti permetteranno nemmeno di farlo.
Tutto ciò che serve è avere una correlazione per convertire il timestamp dall'orologio di un lato all'altro dell'orologio del lato opposto. D'altra parte hai bisogno che questa correlazione sia piuttosto precisa, diciamo almeno al centesimo di secondo, se vuoi usarla per predire le posizioni dei giocatori. L'orologio di sistema non sarà mai così ben correlato tra macchine casuali. Quindi dovresti stabilire tu stesso la correlazione, usando qualche variazione sul tema NTP , probabilmente incorporato negli altri tuoi messaggi per conservare la larghezza di banda della rete .
L'idea di base potrebbe essere che con ogni pacchetto che hai inviato il timestamp che hai inviato e il numero di sequenza di e timestamp quando hai ricevuto l'ultimo pacchetto dall'altra parte. Da questo si calcola il viaggio di andata: per esempio
se il pacchetto Q dice che è stato inviato a 1000 e il pacchetto P è stato ricevuto a 500, rispetto a quando hai inviato il pacchetto P a 0 e stai ricevendo Q a 800, il round-trip è (800 - 0) - (1000 - 500) = 300 Non c'è modo di conoscere l'asimmetria, quindi presumi che il pacchetto impieghi metà (150) zecche in entrambe le direzioni. E questo timestamp remoto è più veloce del locale di 1000 - (800 - 150) = 350 tick. Il viaggio di andata e ritorno varierà. Se ritieni che l'orologio sia ragionevolmente preciso, dovresti utilizzare una media a lungo termine della correlazione.
Nota che non vuoi nemmeno usare l'orologio di sistema per l'orologio. Potrebbero essere risincronizzati a metà strada, gettandoti fuori pista. Dovresti usare clock(CLOCK_MONOTONIC)
su Unix o GetTickCount
su Windows (non sono sicuro di come queste API siano avvolte in Java o Python in questo momento).
Nota: l'opzione SO_TIMESTAMP
socket (vedi socket (7) menzionata da ott-- nel commento sulla domanda) sarebbe utile per separare l'effetto della latenza del ciclo di eventi che riceve i pacchetti. Se vale la pena, lo sforzo dipende dalla precisione di cui hai bisogno.