Creo que definitivamente no está bien sincronizar el reloj en el sistema . El usuario no espera que toque la configuración del sistema y muchos sistemas ni siquiera lo dejan.
Todo lo que necesita es tener una correlación para convertir la marca de tiempo del reloj de un lado al reloj del otro lado. Por otro lado, necesita que esta correlación sea bastante precisa, digamos al menos una centésima de segundo, si desea usarla para predecir las posiciones de los jugadores. El reloj del sistema nunca estará tan bien correlacionado entre máquinas aleatorias. Por lo tanto, debe establecer la correlación usted mismo, utilizando alguna variación en el tema NTP , probablemente incrustado en sus otros mensajes para conservar el ancho de banda de la red.
La idea básica podría ser que con cada paquete que envió la marca de tiempo lo envió y el número de secuencia y la marca de tiempo cuando recibió el último paquete del otro lado. A partir de esto, calcula el viaje de ida y vuelta: por ejemplo, si el paquete Q dice que se envió a 1000 y el paquete P se recibió a 500, luego de que usted envió el paquete P a 0 y está recibiendo Q a 800, el viaje de ida y vuelta es (800 - 0 ) - (1000 - 500) = 300. No hay forma de conocer la asimetría, por lo que simplemente asume que el paquete toma la mitad (150) de ticks en cualquier dirección. Y esa marca de tiempo remota está por delante de la local en 1000 - (800 - 150) = 350 ticks. El viaje de ida y vuelta variará. Si asume que el reloj es razonablemente preciso, debe usar un promedio a largo plazo de la correlación.
Tenga en cuenta que tampoco desea utilizar el reloj del sistema para el reloj. Es posible que se vuelvan a sincronizar a mitad de camino, lo que lo desviará del camino. Debería usarlo clock(CLOCK_MONOTONIC)
en Unix o GetTickCount
en Windows (no estoy seguro de cómo esas API están envueltas en Java o Python en este momento).
Nota: La SO_TIMESTAMP
opción de socket (ver socket (7) mencionado por ott-- en el comentario sobre la pregunta) sería útil para separar el efecto de latencia del bucle de eventos que recibe los paquetes. Si vale la pena el esfuerzo depende de cuán buena precisión necesite.