Esta guia trata sobre el net code en la versión 1.6 (echo por tact!c)
Empezaré explicando el fenómeno del choke y como afecta al modo de juego y a las configuraciones del Net Code.
Choke
El Choke se determina por lo siguiente:
La siguiente vez que un paquete (de datos) puede ser enviado es:
Tiempo actual + 1/cl_updaterate
Tiempo actual + (numero de bytes acabados de enviar / tu rate)
Por lo que, si tu juegas con alto valor en cl_updaterate tu obtendrás seguramente más choke si tu ancho de banda no puede aguantarlo. También, con un montón de jugadores en el mundo significa que más datos están siendo enviados por lo que obtendrás más choke todavía (si tu ancho de banda no puede aguantarlo). Para terminar, teniendo poco rate conseguirás tener más choke.
Si el choke ha hecho efecto, el servidor intenta ver si puede mandar un paquete al cliente en cada frame desde que esto sucede, esperando al siguiente múltiplo de /1 cl_updatarate hasta que el choke se vaya.
Interpolación
La interpolación es la forma en la que el motor del Half-Life usa la interpolación para almacenar posiciones y tiempos, cuando estas posiciones son correctas. Entonces el motor utiliza ex_correct para analizar y comparar cual sería una posición optima entre las 2 posiciones conocidas (que no tienen que ser las 2 últimas posiciones). Esto significa que el movimiento será a la misma velocidad que fue entre esas 2 posiciones, sin importar el valor ex_interp es usado ( con tal de que ex_interp sea 1/cl_updaterate o mayor).
El único caso en el cual el jugador podría moverse más rápido sería tras una gran caída de datos o si el jugador tiene un gran retraso (debido al ping o latencia) desde que el no tenía conexión con el servidor y tenía que moverse rápidamente en la posición correcta.
Comandos
cl_updaterate/cl_cmdrate
Por que los valores por defecto de estos comandos es relativamente bajo es porque el juego está diseñado para jugadores con todo tipo de conexión y tener un juego suave por Internet. Otra razón es que LSD debería trabajar en la mayoría de los ordenadores y no causar una gran carga en la CPU.
Como expliqué en mi otro artículo sobre el net code, el cl_updaterate y cl_cmdrate controla el tráfico entre servidor-cliente y cliente-servidor. A más valor, mayor tráfico de datos. Sin embargo, utilizar valores bajos no creará una mala imagen en tu PC (solamente ocurrirá si empiezas a perder muchos datos) porque no hay necesidad de tener dato-respuesta en todo momento mientras el motor de Half-Life trabaja.
Lo malo de usar un cl_updaterate y cl_cmdrate muy alto es que:
El ancho de banda del cliente no maneje todo el tráfico de datos y reciba choke (como ya explique anteriormente).
El servidor en el que estés jugado tenga que funcionar bajo mucha más presión con más y más movimientos pequeños enviados al server para calcularlos, lo que causará más consumo de potencia de la CPU y Lag en el server.
El factor más importante aquí es colocar estos valores dependiendo de tu valoración individual y del ancho de banda que tu ordenador aguanta. En Lan y en torneos, estos valores deberían ser altos para una mejor consistencia.
ex_interp 0.1
Es un comando muy debatido y temido del cual se han contado montones de historias. En el Counter-Strike 1.5, el mejor valor para el uso del ex_interp es el predeterminado, 0.1. Esto se debe a un pequeño bug (tanto en el cliente como en el servidor) que afecta en cómo la interpolación es calculada en el cliente y enviada al servidor (y por esto, cómo afecta en la cantidad de compensación de lag del servidor). Por ello, el valor 0.1 hace un buen trabajo minimizando este bug. Tener en cuenta que el valor 0.0 no esta limitado por el servidor como mucha gente cree.
Tal y como algunos ya sabéis, el net code cambiará en el Counter-Strike 1.6. El cálculo que hacen el cliente y el servidor para compensar el lag ha cambiado. Ésto significa que ex_interp puede ser (y debería) fijado a 1/cl_updaterate (0.01 con cl_updaterate 100) a 0.1. La implantación de la nueva fórmula 1/cl_updaterate es porque, asumiendo que no hay paquetes perdidos, los jugadores y los objetos se moverán continuamente y recibirán el próximo envio del servidor justo despues de que hayan terminado de interpolar. Date cuenta que para que ex_interp 0.01 haga efecto completo el servidor necesita ser capaz de mandar 100 paquetes por segundo y la mayoría de los servidores no llegan a esa cifra.
Con el viejo bug podías matar a la mitad de los jugadores aprovechando la poca precisión de los puntos de golpe de los enemigos e incluso con un ex_interp grande cerca de 0.1. Esto está arreglado en la versión 1.6, significando que podrás cambiar ex_interp sin obtener una ventaja injusta.
sv_lan
Después de que la CPL (y otros eventos) cambiaran sus reglas del net code del cl_updaterate y cl_cmdrate determinado a valores más altos hemos notado bastante choke en torneos LAN. Ésto ocurre porque el HLDS fuerza el rate a 10000 en cada cliente cuando el servidor corre bajo sv_lan 1. En un principio, esto se creó no para limitar el rate a 10000, sino para aumentar el valor predeterminado de los clientes de 2500 a 10000 y lograr una mejora del juego en LAN. Ésto será arreglado en esta próxima versión del Counter-Strike. Sin embargo, el motor del Half-Life limita el rate a 20000, así que cualquier valor por encima de ese es ignorado.
ex_extrapmax 1.2
La extrapolación sucede cuando el cliente no tiene una posición final a la que interpolar. Entonces extrapola a una posición predecida a la cual se mueve al cliente. Extrapmax fija la cantidad de tiempo máximo en la que se extrapolará al jugador, es decir, cuánto de lejos. Si la posición está fuera de este valor el jugador no se moverá. El servidor siempre fuerza a una posición predeterminada, así que cambiar este valor no hará nada.
ex_correct 0
Otra manera de calcular la interpolación del cliente y predecir sus movimientos. El servidor siempre fuerza al valor predeterminado 0. Será eliminado en esta próxima versión del Counter-Strike.
ex_maxerrordistance 64
Si ex_correct está fijado a 1, puedes fijar el radio máximo en el que el jugador será desplazado suavemente desde la posición X a la posición Y. Si se mueve a un jugador fuera de este radio, será desplazado inmediatamente (teletransportado) a la posición final. De todas maneras, el servidor siempre fuerza el ex_correct a 0. Por eso ex_correct 0 será eliminado en esta próxima actualización del Counter-Strike.
sys_ticrate
Este valor limita la tasa de fotogramas de los servidores dedicados. Cuanto más alto sea el valor, más paquetes podrán ser enviados a los clientes.
sv_maxupdaterate
Este valor limita el updaterate máximo del servidor. Cuanto mayor sea el valor, más paquetes podrán ser enviados a los clientes (si la tasa de frames del servidor es suficientemente alta).
¿Que comandos cambio y a que valor?
A algunos de vosotros os interesará directamente que comandos es imprescindible cambiar y a que valor para bajar el ping, no hay unos valores exactos pero esta orientación os será de gran utilidad. Los valores que damos son variables, dependen también del ordenador que tengas.
cl_updaterate
Por defecto: 20
Recomendado: 20-100 dependiendo del ancho de banda. Si los datos que recibes net_grph 3 los verás) varían en gran cantidad, baja este valor.
56Kb, 20
ADSL256, 35-40
cl_cmdrate
Por defecto: 30
Recomendado: Igual a tus FPS (recuerda que el máximo en el Half-Life y sus Mods es 99/100), si tu ancho de banda no puede aguantarlo usa un divisor (50, por ejemplo). Si tu ancho de banda aguantara, pon 100 (sucederá en partidas LAN, por ejemplo).
56Kb, 30
ADSL256 (con un buen PC), 50-60
x_interp
Por defecto: 0'1
Recomendado: 0'05-0'1
Disminuye el tiempo de la interpolación, con este comando suavizas los movimientos de los jugadores, los jugadores se moverán abruptamente, pero con precisión.
cl_lc
Por defecto: 1
Recomendado en Internet: 1
Recomendado en LAN: 0
Si no tienes menos de 10 de ping (una buena LAN) dejalo en 1, usando este comando con valor 0 perderás todo el LAG, pero sólo lo podrás hacer en el caso de tener 0-10 de ping.
cl_lw
Por defecto: 1
Recomendado en Internet: 1
Recomendado en LAN: 0
Con valor 0 el borras el comportamiento de tus balas e impactos, es decir, una bala disparada es enviada al server y vuelve sabiendo si ha impactado o no, ahora ya sabes seguro si ha impactado.