2011-03-25 22 views
5

Estoy trabajando en un proyecto de varios jugadores en Java y estoy tratando de refinar cómo reúno mis resultados de medición de latencia.Medición de latencia

Mi configuración actual es enviar un lote de paquetes UDP a intervalos regulares que obtienen el registro de horas del servidor y se devuelven, luego se calcula y registra la latencia. Tomo una cantidad de muestras y luego calculo el promedio para obtener la latencia.

¿Esto parece una solución razonable para resolver la latencia en el lado del cliente?

+0

Supongo que todas sus comunicaciones se realizan mediante UDP. – biziclop

+0

De hecho, eso es correcto. – TechyAdam

Respuesta

3

También podría marcar los paquetes utilizados en su protocolo de juego. Por lo tanto, tendrá más datos para integrar sus estadísticas. (Este método también es útil para evitar la sobrecarga causada por una ráfaga adicional de datos. Simplemente usó los datos que ya está intercambiando para hacer sus estadísticas)

También podría comenzar a usar otras métricas (por ejemplo, varianza) en para hacer una estimación más precisa de la calidad de su conexión.

+0

Hola, 0verbose, me gusta esta idea, pero supongo que el problema sería que cada paquete requeriría una respuesta tipo de duplicar el tráfico, supongo? – TechyAdam

+0

@TechyAdam: cuantas más "marcas de tiempo" recopilas, más precisas son tus estadísticas. Por supuesto, enviar una gran cantidad de paquetes sin usar solo para recolectar estadísticas no es una buena idea. Sí, por supuesto, un paquete requeriría una respuesta inmediata para ser útil. De todos modos, podría tratarse simplemente de un paquete ack devuelto al cliente, con una pequeña dimensión que contiene solo la marca de tiempo, un número de secuencia de paquete y pocos datos como ese. – Heisenbug

+0

@TechyAdam: pero al responder a usted, pensé que ya estaba enviando al cliente algún tipo de datagrama UDP ack, porque UDP no es confiable y por lo tanto necesita al menos algo de seguridad para asegurarse de que los paquetes enviados antes llegaron al destino . – Heisenbug

15

Tengo la marca de tiempo del cliente del paquete saliente, y la respuesta conserva la marca de tiempo original. De esta forma, puede calcular la latencia de ida y vuelta al tiempo que evita cualquier problema ocasionado por los relojes del servidor y del cliente que no están exactamente sincronizados.

+1

gracias. la sincronización de tiempo fue exactamente mi problema. Mis dos relojes del sistema operativo de Windows se sincronizaron con el reloj de Internet, pero por alguna razón todavía están apagados por unos 3 segundos, así que no pude encontrar latencia en un sentido. Tu camino funciona como el encanto. –

0

Si aún no ha comenzado su proyecto, considere utilizar un marco de red como KryoNet, que tiene RMI y serialización eficiente y que enviará automáticamente solicitudes de ping utilizando UDP. Puede obtener los valores de tiempo de ping fácilmente.

0

Si está midiendo la latencia de ida y vuelta, factores como la deriva del reloj, la precisión del reloj HW y la API del sistema operativo afectarían su medición. Sin gastar dinero en el hardware, lo más cercano que puede obtener es mediante el uso de instrucciones RDTSC. Pero RDTSC no tiene sus propios problemas, debes tener cuidado de cómo lo llamas.