Estoy agregando multijugador en red a un juego que he hecho. Cuando el servidor envía un paquete de actualización al cliente, incluyo una marca de tiempo para que el cliente sepa exactamente cuándo esa información es válida. Sin embargo, la computadora del servidor y la computadora del cliente pueden tener sus relojes configurados en diferentes momentos (tal vez incluso unos pocos segundos de diferencia), por lo que la marca de tiempo del servidor debe traducirse a la hora local del cliente.Medición de la diferencia de tiempo entre dispositivos en red
Entonces, me gustaría saber la mejor manera de calcular la diferencia de tiempo entre el servidor y el cliente. Actualmente, el cliente pings el servidor para un sello de tiempo durante la inicialización, toma nota de cuándo se envió la solicitud y cuándo fue respondida, y adivina que la marca de tiempo se generó aproximadamente a la mitad del recorrido. El cliente también ejecuta 10 de estas pruebas y toma el promedio.
Pero, el problema es que obtengo resultados diferentes en ejecuciones repetidas del programa. Dentro de cada conjunto de 10, cada medición rara vez diverge en más de 400 milisegundos, lo que podría ser aceptable. Pero si espero unos minutos entre cada ejecución del programa, los promedios resultantes pueden estar en desacuerdo hasta en 2 segundos, lo que no es aceptable.
¿Hay una mejor manera de descubrir la diferencia entre los relojes de dos dispositivos en red? ¿O hay al menos una forma de modificar mi algoritmo para obtener resultados más precisos?
Detalles que pueden o no ser relevantes: los dispositivos son iPod Touch que se comunican a través de Bluetooth. Estoy midiendo que los pings oscilan entre 50 y 200 milisegundos. No puedo pedirles a los usuarios que sincronicen sus relojes. :)
Actualización: Con la ayuda de las siguientes respuestas, escribí una clase objetivo-c para manejar esto. Lo publiqué en mi blog: http://scooops.blogspot.com/2010/09/timesync-was-time-sink.html
¡Guau! ¡Gracias! Eso es exactamente lo que estoy buscando. Todavía no tengo muy claro por qué es mejor que mi método original (aunque creo que lo es), pero volveré a publicarlo cuando lo pruebe. No creo que deba ajustar d durante una sesión de juego, pero no debería ser difícil si lo necesito. ¡Gracias de nuevo! – whooops
Esto ha funcionado muy bien. Descubrí que si siempre tomo los valores más pequeños (es decir, los más negativos) t1 y t2, es lo mismo que tomar los pings más pequeños, por lo que converge en el desplazamiento correcto. He t1 = sello de cliente - servidor sello y t2 = sello de servidor - cliente sello Además, he descubierto que iphones deriva bastante significativamente! En media hora, la compensación real entre dos dispositivos podría cambiar hasta medio segundo. Lo verifiqué con programas de reloj que contactan servidores NTP. – whooops
Me alegro de que haya sido útil para ti. –