Estoy escribiendo un juego de iOS en red. Al enviar paquetes con GKMatchSendDataReliable
(que supuse que era UDP con su propio código de recepción de paquetes escrito) a 60 paquetes por segundo (es decir, 16 ms entre paquetes adyacentes), los tiempos de ping promedio empeoran rápidamente: abrí 7 coincidencias de GameCenter a continuación (una tras otra ) y simplemente envió una "inundación" de 100 paquetes (a una velocidad de 60 paquetes por segundo). Medí el tiempo promedio de ida y vuelta, y estos son los resultados:
[ 21:16:39 ]: I saw an average roundtrip time of 52.342787 ms, he saw 54.496590 ms
[ 21:16:34 ]: I saw an average roundtrip time of 62.631942 ms, he saw 61.991655 ms
[ 21:16:45 ]: I saw an average roundtrip time of 88.394380 ms, he saw 83.619123 ms
[ 21:16:51 ]: I saw an average roundtrip time of 179.053118 ms, he saw 156.869141 ms
[ 21:16:57 ]: I saw an average roundtrip time of 75.025076 ms, he saw 75.419723 ms
[ 21:17:23 ]: I saw an average roundtrip time of 8832.082488 ms, he saw 7616.877558 ms
[ 21:19:33 ]: I saw an average roundtrip time of 25088.962344 ms, he saw 16833.064914 ms
Después de las últimas 2 pruebas, los resultados son alrededor de 1000 ms.
Parece que estoy siendo estrangulado, probablemente por mi ISP. Debido a que este es un juego de iOS, la gente usará conexiones residenciales regulares.
Cuando cambié la velocidad de envío de paquetes a 10 veces más lenta (1 paquete cada 160 ms), las pruebas tomaron mucho más tiempo, pero los tiempos de ida y vuelta siguen siendo consistentemente bajos.
[21:31:27]: vi un tiempo promedio de ida y vuelta de 55.289109 ms, vio 69.032727 ms
Por lo tanto, parece mantener una baja latencia en la conexión (y no ser "castigado" por los ISP). Tengo que reducir la velocidad de los paquetes que envío. Tenga en cuenta que estos son paquetes muy pequeños, como un máximo de 40 bytes, pero todavía estoy siendo estrangulado.
¡Estoy buscando pautas sobre cuántos paquetes UDP puedo enviar por segundo para evitar ser acelerado! ¿Hay alguna guía general en alguna parte?
fuente
Respuestas:
Ni siquiera los juegos de acción basados en PC o grandes MMO ejecutan sus paquetes a 60Hz. Además, tener paquetes de tamaño realmente pequeño no es necesariamente una gran cosa, cada uno de esos pequeños paquetes tiene una gran sobrecarga al enviarlo.
Intente disparar para actualizaciones de 10Hz con alguna interpolación del lado del cliente. Supongo que ya estás interpolando porque siempre habrá retrasos en el ping.
Lea sobre los tamaños de MTU y agregue más información para cubrir el período de tiempo más largo. Un tamaño de paquete promedio en la capa de transporte será de aproximadamente 1400, cualquier cosa por encima del tamaño de MTU dividirá su mensaje y causará aún más sobrecarga.
fuente
Primero, debe asegurarse de cuán grande es la información completa. Su ISP probablemente se preocupará por los bytes reales enviados, no por la cantidad o frecuencia de datagramas. Si envía datagramas de tamaño máximo (65507 octetos de carga útil) 60 veces por segundo, está enviando alrededor de 30 Mb / s en sentido ascendente. No todos tienen ese tipo de conexión.
Recuerde que el encabezado IP tiene 20 octetos de largo y el encabezado UDP tiene 8 octetos de largo. Eso es 28 octetos adicionales que está enviando para cada datagrama.
Si no está maximizando su conexión, hay muchos lugares donde sus paquetes pueden retrasarse: a saber, el sistema operativo del cliente, su puerta de enlace (probablemente un enrutador inalámbrico o módem de cable), su ISP, el ISP del otro par, el otro par gateway, el sistema operativo del otro par entre otros.
En caso de que aún no lo haya usado, le recomiendo que use Wireshark , que es una herramienta extremadamente poderosa para diagnosticar problemas de red. Piense en ello como el equivalente de un depurador, pero para redes.
Hay varias formas de diagnosticar el tráfico de red con Wireshark:
Use Wireshark en una PC en la misma red que el dispositivo móvil, con un hub promiscuo y configurando su dispositivo de red como promiscuo
Configure una PC como puerta de enlace inalámbrica y conecte su dispositivo móvil a esa puerta de enlace, luego escuche con Wireshark en dicha PC
Ejecute Wireshark en la misma máquina que un emulador
Ejecute tcpdump en el propio dispositivo (fácil en Android, requiere jailbreak en iOS), y luego lea los datos capturados en Wireshark
Haga un programa simple que haga exactamente lo mismo, pero que funcione en una PC, y use Wireshark allí.
... y muchos otros
Desea verificar qué paquetes se envían y cuándo. Por ejemplo, si el retraso se produce antes de que se envíen, el sistema operativo lo estrangula; mientras que si está recibiendo el retraso incluso en una versión de escritorio del mismo programa, esto significa que la red lo está estrangulando en alguna parte.
Por lo general, si la red lo estrangula, debe obtener datagramas ICMP tipo 4, de modo que pueda usarlos para verificar exactamente dónde se estrangula.
En conclusión, hay muchas razones por las cuales sus paquetes pueden retrasarse, y sería conveniente averiguar dónde está el problema antes de comenzar a intentar resolverlo.
fuente
Parece que uno de mis supuestos estaba equivocado. De acuerdo a esto :
Cambiar el modo de envío a UDP real (es decir
GKMatchSendDataUnreliable
) parece mantener bajas tasas de ping a 60 paquetes por segundo. Parece que Nagles me ha golpeado una vez más .Todavía tengo un comportamiento extraño (períodos con tiempos de ping muy altos), pero no estoy seguro de la causa raíz (ISP o congestión de la red).
Más tarde:
Entonces es esporádico y va en oleadas. Supongo que tendré que probar algunas de las sugerencias en las otras publicaciones, como reducir la tasa de envío de paquetes.
fuente