Search This Blog

Como muchos otros ya hicieron, por favor dejen comentarios o críticas, se aprecian!

Thursday, October 15, 2009

Configuración para el juego online

Esta guía fue hecha originalmente para un foro, pero pienso dejarla aquí y editarla en algun futuro si considero necesario. Decia algo asi ;P :


Hice esta "guía" sobre las configuraciones del TF2 al jugar online ya que hay escasa información sobre esto en español, y la gran mayoría de la gente, o no tiene idea de que esto siquiera existe, o simplemente lo modifican basandose en lo que otros les dicen, sin saber el por qué o entender lo que estan cambiando.



En el Team Fortress 2 (como en todo juego source), el servidor simula el juego en "momentos" de tiempo (si se los puede llamar así..) llamados "ticks", es decir, en cierto tiempo "congela" el mundo que simula y envía información sobre este a los clientes conectados, ya que una transmisión constante no sería posible en la gran mayoría de las conexiones de Internet de hoy por hoy.
Se obtiene en promedio 66 paquetes de actualizaciones por segundo de un servidor (ya que el tickrate esta limitado a 66 por Valve). Si utilizamos el comando cl_updaterate 66 lo que hacemos es que el cliente "solicite" 66 actualizaciones por segundo, de esta forma teniendo un juego actualizado más constantemente y por ende, más fluido y fiel a lo que realmente esta sucediendo.

Inevitablemente hay un espacio entre cada actualización (porque no se envía una cantidad suficiente como para actualizar el juego del cliente en cada milisegundo). Para esto existe el comando cl_interpolate 1 que habilita la interpolación (un tipo de predicción), y el comando cl_interp, que vendría a ser el tiempo asignado para predicciones entre cada actualización. Su valor predeterminado es de 0.1 (100 milisegundos). De esta manera, uno ve el juego con un "lag" constante, o mejor dicho, 100 milisegundos tarde. Esto le da tiempo al cliente para utilizar las actualizaciones que recibe e interpolar de manera correcta en caso de ser necesario.

El tiempo mínimo que se necesita para el interp es 1seg/66 ≈ 0.0152 s (15 milisegundos).

Ahora, la mayoria de los servidores, cuando hay mucha gente peleando al mismo tiempo y en un mismo lugar, no son capaces de manejar 66 actualizaciones por segundo, y tal vez baje a alguna cantidad como puede ser 55/seg.

Entonces el mínimo interp que necesitarías sería 1/55 = 0.018 (18ms)
Básicamente, al utilizar 0.015 (1/66) se esta dando el menor lugar posible para que interpole el cliente (utiliza solo el último paquete enviado para predecir y que el juego se vea fluido, cubriendo los 15 milisegundos donde no se recibe nada).

Bajar este número es de suma importancia, ya que se reduce esa "latencia" adicional y se actualiza todo más rápido. Los disparos salen y llegan antes al servidor (particularmente notable con armas de projectiles, como rockets o pipes en el TF2, granadas en el hl2dm y CSS, etc.). Puede probar usar el cl_interp en 0.5 (máximo valor) y disparar,y luego cl_interp 0, y ver la significativa diferencia. Y no solo esto, la información sobre los movimientos llegan antes, por lo que se torna más facil evadir disparos o explosiones.

Por ende, jugando competitivamente (ya sea 5v5 en CSS o CSGO, 6v6 en TF2, etc.) en un servidor como la gente que soporte enviar 66 updates por segundo la mayoría del tiempo, el valor del cl_interp ideal es 0.
Pero si observan el valor del "lerp" en el net_graph veran que no figura como 0.00 ms, sino que como 15.2 ms o 33.33 ms tal vez. Esto se debe a que el juego analiza 2 valores y toma el máximo entre ellos. La fórmula es

Período de interpolación = máx {cl_interp, cl_interp_ratio / cl_updaterate}

Por lo que, sí su interp es nulo, naturalmente el juego tomará el valor del cl_interp_ratio dividido el cl_updaterate. Usar cl_interp_ratio 0 es una mala idea ya que esta "buggeado" del lado del servidor, y al usarlo este actúa como si el cliente tuviera cl_interp_ratio 1. Esto causa problema en el registro de tiros al estar el servidor compensando por una interpolación que no esta ocurriendo.

Para ver los ms. del interp, se puede utilizar el comando net_graph (1,2,3, o 4, lo que les sea mas cómodo ;P). El valor de "lerp" lo indica.
Si esta en blanco esta normal, si esta en naranja significa que el servidor o el cliente esta forzando una interpolación menor a 2/66, es decir, que utiliza menos de 2 actualizaciones en cada predicción, lo cual es malo sólo si se pierden paquetes. El único color preocupante es el amarillo, lo que significa que los FPS del servidor no son suficientes para el intervalo de tiempo que se asigno a la interpolación, lo que causaría un juego con entidades o personajes "teletransportándose" (warp).

Pero estos no son los únicos valores que conviene modificar. El cl_cmdrate básicamente controla la cantidad de paquetes de actualizaciones que uno envía hacia el servidor. Esto se ve limitado por la cantidad de FPS (frames per second) que uno tenga en el juego. Por ende, si uno utiliza cl_cmdrate 66 (el valor óptimo generalmente) pero juega con 30 fps, solo podrá enviar información de esos 30 frames y no de los 66 que habilita a enviar el comando.

También esta el valor de rate, que es lo que el cliente utiliza para decirle al servidor sus capacidades de banda ancha, y así evitar que el servidor envíe más actualizaciones de las que el cliente puede descargar, y no se pierdan paquetes en el camino (se escribe en bytes/segundo).
Si se esta teniendo choke en un servidor, es buena idea probar aumentar el valor del rate para tratar de solucionarlo (aunque muchos servidores lo limitan por conveniencia o ignorancia).

Para aprovechar la compensación del lag con la que vienen los juegos source de valve, se debe usar los comandos cl_lagcompensation 1 y cl_lagcomp_errorcheck 1. Ambos ayudan mucho a la hora de jugar por Internet, y en casos de diferencias de ping.
Hay otras cosas de las que se puede hablar y explicar, pero esto es básicamente lo más importante.

En resumen

Rate entre 20000 y 100000 (dependiendo si tu conexión lo soporta y si el servidor lo limita)
cl_cmdrate "66"
cl_updaterate "66"
cl_interpolate "1"
cl_interp "0" ( Si comienzan a ver el juego lageado, puede probar subirlo, por ejemplo a 0.0333
cl_lagcompensation "1"
cl_lagcomp_errorcheck "1"
cl_smooth "1"
cl_predict "1" (activa la predicción por parte del cliente)
cl_predictweapons "1" (Activa la predicción de efectos en armas por parte del cliente)
cl_pred_optimize "2"


Referencias:
https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
http://etf2l.org/forum/customise/topic-22896/page-1/

No comments:

Post a Comment