Guía sobre rates, interpolación y servidores

B

Somos muchos los que llevamos años teniendo problemas y quejas con el registro de hits del source engine. Tras años de incertidumbre y ver que en el sucesor del CS:Source (CS:GO) la cosa seguía igual decidí que había que ponerse las pilas y llegar al quid de la cuestión. La conclusión a la que llegué después de leer mucha documentación es que es un problema mixto: hay servidores extremadamente mal configurados y jugadores que no tienen ningún conocimiento real sobre cómo configurar su cliente. Aunque no culpo a nadie… hay más desinformación que información en internet.

Tras leer un breve e interesantísimo post me entró la necesidad de saber todo sobre este tema y controlar hasta el más mínimo detalle. Os lo dejo aquí, aunque está en inglés. En cualquier caso gran parte de lo expuesto en él entra dentro de este artículo.

El servidor y el tickrate

Un servidor se encarga de simular un entorno virtual tomando snapshots (pequeñas muestras de información) cada cierto tiempo y así poder registrar con precisión lo que sucede en la partida a cada instante. Decimos que un servidor es tickrate 100 cuando toma 100 muestras cada segundo (1 muestra cada 10 ms). Cuanto mayor sea el tickrate de un servidor mayor será la precisión en la simulación de la partida, acosta de consumir mayor ancho de banda y capacidad de proceso (CPU) en la máquina que hostea el servidor.

Tickrate 64 = 1 tick cada 15.62 ms
Tickrate 100 = 1 tick cada 10 ms
Tickrate 128 = 1 tick cada 7.8 ms
Tickrate 150 = 1 tick cada 6.7 ms

El cliente y el rate

Hasta ahora solo hemos hablado del servidor. Veamos que tienen que tener en cuenta los clientes que se conectan al mismo en función del tickrate al que se sirve la partida.

Supongamos que un cliente con un framerate estable de 100 fotogramas por segundo conecta a un servidor tickrate 100. Esto quiere decir que su máquina es capaz de producir 100 snapshots cada segundo. Para poder enviarle esa cantidad de información al servidor se requiere de un ancho de banda el cual determinaremos con el cvar rate que mide los bytes por segundo que queremos reservarle al juego a la hora de transmitir paquetes. Es importante aclarar que esta variable tan solo atañe al cliente, aunque el servidor pueda forzar el rate del cliente (sv_maxrate/sv_minrate).

Además del rate, el cliente puede definir dos parámetros más:

cl_cmdrate: cantidad de user commands (instrucciones de teclado y ratón) que el cliente sube al servidor por segundo.
cl_updaterate: cantidad de updates que el cliente demanda del servidor por segundo.

Lo más apropiado es que si el servidor es tickrate 100 y nuestra máquina es capaz de generar 100 fps, ambos cvars estén a 100. Si por el contrario nuestra máquina no fuera capaz de sustentar ese framerate lo más propio sería limitarlo en la media y ajustar tanto el cmdrate como el updaterate a esa media. Tampoco tiene ningún beneficio el subir o demandar más updates de los que el servidor puede ofrecer, así que jugar con cmdrate y updaterate superiores al tickrate del servidor es totalmente innecesario. Existe una tendencia bastante habitual a la hora de configurar el cl_cmdrate que consiste en incrementarlo una o varias unidades por encima del tickrate del servidor para corregir la posible pérdida de paquetes desde el cliente. Yo sinceramente no puedo afirmar que eso funcione porque en la documentación oficial de Valve no menciona nada al respecto. Daño no hace seguro así que si os inspira más confianza subirlo un par de unidades no os cortéis. En cuanto al cl_updaterate, como viene limitado por el tickrate del servidor, aumentarlo no tendría ningún efecto.

Es importante tener en cuenta que ambos parámetros dependen directamente del rate que tengamos definido. Tanto es así que si el rate es excesivamente bajo sufriremos de choke por no poder subir suficientes user commands al servidor o descargar el 100% de los updates que nos ofrece el servidor. Pero hablaré más sobre este tema en el siguiente apartado.

Nota: el cl_cmdrate puede también limitarse por el servidor (sv_maxcmdrate). El cl_updaterate no pero tiene su lógica… ¿para qué iba a limitar un servidor la cantidad de updates que recibe el cliente más allá del tickrate preestablecido? Precisamente cuando creamos un servidor tickrate 64, 100 o 128 estamos limitando la cantidad de updates para cada cliente.

Servidor y cliente trabajando en conjunto

Probablemente ahora os estaréis preguntando qué rate es el ideal para poder jugar en buenas condiciones. Este apartado es fundamental e involucra tanto al servidor como al cliente. Para poder explicarlo primero hay que tirar de un poco de teoría.

Counter Strike: Global Offensive tiene un parámetro definido por el servidor (net_maxroutable) que determina cual es el tamaño máximo en bytes de cada paquete de información que se envía y se recibe en las comunicaciones cliente-servidor. El estándar está definido en 1200 bytes por paquete (en el source son 1260). ¿Qué quiere decir esto? Pues que dependiendo de nuestro cmdrate/updaterate necesitaremos enviar y recibir más o menos bytes por segundo:

  • En un servidor tickrate 64 necesitaríamos 1200 * 64 = 76800 bytes. De ahí que los servidores de Valve tengan un rate por defecto de 80.000 bytes
  • En un servidor tickrate 100, 1200*100 = 120000 bytes de rate.
  • En un servidor tickrate 128*1200 = 153600 bytes de rate.

Esto es lo que dice la teoría. En la práctica el ancho de banda se optimiza muchísimo gracias a lo que se conoce como delta compression, la cual consiste en lo siguiente: el servidor no envía un snapshot completo por cada tick sino que tan solo envía los cambios que se han producido desde el último full-snapshot que se envió a cada cliente. Normalmente los full-snapshots se envían solo al inicio de cada ronda o cuando algún cliente sufre de packet loss intenso. Seguro que más de uno por aquí recordará los típicos subidones de choke que pegaban algunos servers públicos al iniciar las rondas; eso sucedía precisamente porque en ese instante el servidor trata de enviar full snapshots a todos los clientes y por algún motivo el ancho de banda es insuficiente, ya sea porque el hosting tiene una restricción de upload baja para la cantidad de clientes que tiene que soportar o porque los clientes tienen sus rates mal configurados y no perciben toda la información que el servidor necesita mandarles.

En definitva: el rate recomendado por Valve siguiendo la teoría expuesta anteriormente está muy por encima del consumo real medio que se hace gracias a la compresión delta, por lo que generalmente podríamos jugar con un rate inferior al sugerido. Ahora, yo recomiendo que todo el mundo empiece a alejarse ya de rates por debajo de los 80000 bytes en servidores tickrate 100 o 128. Y espero que esta información le llegue a unos cuantos server admins porque es bastante triste ver servidores limitados a un sv_maxrate de 30000 bytes o incluso menos.

Interpolación: cl_interp, cl_interp_ratio y lerp

La interpolación es un tema que a muchos nos trae de cabeza pero lo cierto es que es mucho más sencillo de lo que puede parecer.

La interpolación, definida de manera sencilla, consiste en generar uno o varios frames “falsos” a partir de uno anterior y otro posterior, de forma que conseguimos una animación fluída aunque no sea 100% representativa de la realidad. En un entorno virtual que funcionase casi en tiempo real (como una red LAN) la interpolación no es realmente necesaria ya que la probabilidad de que un cliente pierda algún paquete es ínfima. En cambio en entornos WAN (internet) la pérdida de paquetes se produce con relativa facilidad, especialmente en aquellas personas que juegan con wifi o con PCs que no pueden lidiar con el framerate requerido por el servidor, ya sea por insuficiencia de hardware o de ancho de banda. En esos casos la interpolación es un buen aliado.

El lerp, valor que podemos mostrar haciendo uso del net_graph 1, nos indica nuestra latencia de interpolación en milisegundos. En otras palabras: si tenemos un lerp de 10 ms en un servidor tickrate 100 significa que tenemos 1 frame extra para poder interpolar en caso de que haya pérdida de paquetes. Si tuviéramos 20 ms tendríamos 2 frames.

En cuanto a cómo configurar la interpolación, tan solo tenemos que tener en cuenta lo siguiente: el cl_interp lo dejamos a 0 y este se regulará en función del cl_interp_ratio y nuestro cl_updaterate, haciendo una división del primero entre el segundo; me explicaré con varios ejemplos:

  • Situación A: server tickrate 100 con cl_interp_ratio 1 y cl_updaterate 100. El lerp lo calcularíamos de la siguiente forma -> 1/100 = 0.01 segundos = 10 ms = 1 frame adicional para interpolar. Es, si no me equivoco, la interpolación más baja que podemos configurar. Esta configuración es la recomendada cuando nuestra conexión es buena y el servidor funciona correctamente.

  • Situación B: server tickrate 100 con cl_interp_ratio 2 y cl_updaterate 100. El lerp sería -> 2/100 = 0.02 segundos = 20 ms = 2 frames adicionales para interpolar.

Cuando el lerp está de color anaranjado significa que, en caso de pérdida de paquetes de algún cliente corremos el riesgo de perder frames y ver a la gente a saltos.
En resumen:

  • cl_interp 0 // cl_interp_ratio 1: para conexiones/servidores decentes.
  • cl_interp 0 // cl_interp_ratio 2: para conexiones/servidores poco eficientes.

El Netgraph

Es curioso que aunque somos muchos los que usamos el net_graph 1 a diario, pocos saben interpretar los distintos valores que se muestran en el mismo. Con la siguiente explicación voy a tratar de aparcar todas las dudas que podáis tener.

La captura que adjunto a continuación se ha realizado desde un cliente conectado a un servidor dedicado tickrate 128 con la siguiente configuración:

  • fps_max 61
  • cl_cmdrate 128
  • cl_updaterate 128
  • rate 80000
    [/b]

Después de todo lo que habéis leído hasta ahora pensaréis que es absurdo forzar el cliente a 61 fps si es capaz de lidiar un framerate superior. Lo hago simplemente en beneficio del ejemplo que explico a continuación.

A) FPS: indica la cantidad de fotogramas por segundo que se están renderizando en el cliente.

B) PING: tiempo en milisegundos que tarda un paquete enviado desde el cliente al servidor en volver de nuevo al cliente (round trip time, RTT).

C) IN: todo lo que se encuentra en esta fila, a excepción del lerp, hace referencia a la información que entra (IN) en el cliente; en otras palabras, lo que el cliente recibe del servidor.

D) OUT: todo lo que se encuentra en esta fila hace referencia a la información que sale (OUT) del cliente; en otras palabras, lo que cliente envía al servidor.

E) Tamaño en bytes de cada paquete que se recibe del servidor. Recordemos que el parámetro net_maxroutable definía que como máximo los paquetes podían ser de 1200 bytes. Aquí podemos comprobar que, gracias a la compresión delta, el tamaño de cada paquete es muy inferior a 1200 bytes.

F) Tamaño en bytes de cada paquete que el cliente envía al servidor.

G) Consumo medio de ancho de banda de descarga en kilobytes/s.

H) Consumo medio de ancho de banda de subida en kilobytes/s.

I) cl_updaterate del cliente.

J) cl_cmdrate del cliente.

K) Media de updates que se reciben del servidor por segundo.

L) Media de “client command updates” que el cliente envía al servidor por segundo. Como veréis, a pesar de tener el cl_cmdrate a 128 en la configuración de nuestro cliente, tan solo se están enviando 60. La razón es bien sencilla: el cliente tan solo está renderizando 60 frames por segundo (fps_max 61) y por lo tanto no puede subir más información que la que su máquina renderiza.

M) Lerp: latencia de interpolación del cliente en milisegundos.

Como ya expliqué en el apartado “Servidor y cliente trabajando en conjunto”, cada update que enviamos y recibimos del servidor consume una cantidad determinada de bytes. Si nos fijamos en los valores de la captura del netgraph anterior veremos que en el instante que se tomó la captura, el tamaño de los paquetes que estábamos enviando al servidor (F) era de 78 bytes. Si multiplicamos 78 por L deberíamos obtener una cifra muy aproximada a H. Hagamos la comprobación:

78 bytes * 60 = 4680 bytes; 4680 bytes / 1024 = 4,57 Kilobytes

Como veréis en el netgraph nos marca 4,59 Kilobytes. Ese desajuste de 2 centésimas es por estar tratando con medias y redondeos.

Por último destacar también que podemos deducir el tickrate del servidor a partir de los valores máximos de I y J permitidos por el servidor. En cualquier caso, si tenéis dudas podéis poner el net_graph 4 y comprobar el tick directamente.

Conclusión

Quizá la principal razón por la que en muchas ocasiones las balas no registran correctamente es por problemas de configuración tanto en cliente como en servidor. En un servidor con tickrate 100, un cliente que tan solo sube 30 command updates por segundo (cl_cmdrate 30) dificultará el registro de hits ya que el 70% de los frames serán interpolaciones, lo cual reduce la precisión notablemente. Para evitar este tipo de irregularidades y conseguir que el servidor sea equitativo con todos los clientes quizá lo más recomendable sea forzar desde el servidor tanto el rate como el cmdrate de todos los clientes a una cifra común. El rate deberá ser lo suficientemente elevado para satisfacer la demanda del tickrate del servidor.

RPV

Sabe dios que muchos no leeréis todo lo expuesto anteriormente así que aquí simplemente daré las recomendaciones pertinentes para configurar clientes y servidores de 10 slots, aunque yo os recomiendo toda la lectura para que entendáis lo que estáis poniendo. Los valores expuestos a continuación serán solo válidos en condiciones óptimas tanto de servidor como de los clientes conectados al mismo (latencias, fps, capacidad de proceso del servidor y anchos de banda). El server admin y el cliente deberán de configurar lo que se ajuste a sus necesidades, haciendo uso del netgraph como herramienta de benchmarking.

CVARS

Links de interés

Source Multiplayer Networking
Source rates
Tickrate
Rate requirements
2032 CVARS del CS-GO

Agradecimientos

A Zeroks por lanzarse conmigo en la búsqueda del santo grial del netcoding y pasarme mucha información interesante; a Kud0 por montarnos un linux server y dejarnos su ordenador y conexión para montar un servidor de CS:GO en su casa y trastear con él; a Thrazz por aceptar la petición de chincheta para este thread; y finalmente a todos los que habéis colaborado en su crecimiento y difusión ;)

PD: He editado levemente la conclusión para no liar al personal.

82
skela

Yo me lo he leido todo

35
House-

Buen trabajo tío

1 respuesta
GaTToO

Gracias por el curro, ahora me pongo a estudiarmelo un rato :D

1 respuesta
powned

vamos, que para pegar 4 mochas una tarde aburrida hay que hacer toda esa mierda

gg

1 1 respuesta
B

#3 #4 No problem ;) A mandar!

#5 Para quienes tienen poco interés en saber sobre el tema hay un rpv bien majo xD

3
Shinji-Kudo

#1 Enorme tío, Esto ayudara a mucha gente a aclararse, a ver si ahora se empiezan a ver servers decentes :)

2
Rasca_y_Pica

jolin y yo toda la vida con el rate a 25000 xDDD

6
B

#1 gracias por el curro, a favoritos.

Zeroks

mola, se nota que ahí no puedes jugar y te da por escribir xD

luego te comento un par de comandos más por si quieres añadirlos.

2 1 respuesta
B

#10 Jajaja bien visto x_D Me dio por probar el cs:go aquí y en cuanto la gráfica se quedaba sin memoria (cada dos por tres) iba a 10 fps el juego xD Sorprendentemente, si la GPU tuviese suficiente memoria podría jugar a 60 fps O_O

En cuanto vuelva a casa voy a quemar el PC (y el server xD)


edit: Supongo que te refieres al net_splitpacket_maxrate y net_splitrate. No hay información clara sobre esos dos (y nada oficial). Hay quien recomienda no tocarlo y hay quien dice que el subir el net_splitpacket_maxrate al mismo valor que el sv_maxrate y el net_splitrate a 2 en vez de a 1 mejora considerablemente el registro de hits. Se puede probar pero a mi ya me parece meterse en camisa de 11 varas. Sobre todo teniendo en cuenta que casi nadie toca esos parámetros.

Al3s

#1 Gracias, muy bien explicado.

M

Si pones digamos todo al maximo y entras en un server que tenga menos tick,no te lo configura automaticamentE?

1 respuesta
thunder_

Muy útil #1 muchas gracias, una explicación así se necesitaba sobre todo cuando vienes de 1.6 que es todo 25k 101 101

1 respuesta
B

#13 Supongamos que nuestro cmdrate y updaterate están a 128 por cfg y entramos en un server tickrate 100. Lo habitual es que ese servidor tenga un sv_maxcmdrate a 100, con lo cual nuestros rates bajarían automáticamente a 100. En caso de que no estuviese limitado por el servidor, lo único que sucedería es que los 28 packetes extra de tu cmdrate caerían en saco roto. Vamos, que lo limiten por servidor o no, desde el momento en que el servidor es tickrate 100, todo lo que esté por encima será ignorado. De hecho cuando no se limita creo que los muestra en rojo.

L

Menuda obra maestra, un aplauso. ^^

#14

Eso no siempre es así, cuando el servidor lo limita a menos, y tu PC no da 100 fps estables...

1 respuesta
B

#16 Gracias hombre :_D

No se si el quote iba para mi pero tienes razón. Si en un server tickrate 100 la máquina de algún cliente no alcanza 100 fps estables no va a enviar 100 snapshots al server :/ De eso mismo hablábamos el otro día en otro hilo :D

De hecho esa es una de las razones por las que soy partidario que por el momento se siga jugando como mucho en servidores tickrate 100. Dentro de un añito, cuando haya más gente con pc actualizado, ya se subirá a tickrate 128 o 150. Pero claro, en cuanto tienes un server tickrate 100 y no 128 la gente ya se piensa que es la última mierda que cagó Pilatos, así que para no aguantar a cansinos desinformados es casi preferible subirlo a 128 xD

Deberíamos pensar más en los que juegan con equipos antiguos, especialmente durante el primer año. Y no hablo por mi... me doy con un canto en los dientes con mis más de 150 fps.

Massenmorder

Añado el thread a favoritos. Gran trabajo!

iPromiseNz

Pepino de post!, si mucha gente leyera esto podrían mejorar mucho el tema de los hits y las conexiones, FAV! ;)

Jotauvece

joder que curro! podrías poner también la empresas fiables que hay ahora mismo para contratar un servidor, con la cantidad de gente que alquila dedicados y luego los revende no te puedes fiar de nada...

2 respuestas
eagLe__

pero que sean legales, que cobren el iva y te den factura mostrándotelo todo, no ilegales en negro que luego te timan.

LzO

alguien sabria explicarme porque cuando pongo los rates en consola no los guarda? solo guarda el rate, pero el cmd/update nanai...

es ponerlo y como si nada, no deja cambiarlo

2 respuestas
fraJiscow

Tick 128 :qq:

L

#22

No te preocupes, cuando te metes a un servidor se te pone los rates... pero en la consola no sale. Ni idea del porqué.

B

#22 probablemente porque el server te esté limitando el cmdrate (sv_maxcmdrate).

#20 yo también tengo interés por pillar un buen hosting. Mi recomendación es pillarlo fuera de España por el tema de no oír lloros de los guiris, preferiblemente Francia o Alemania. Pero no tengo referencias de ninguna empresa. Hace un tiempo use game-hosting y la experiencia fue buena pero ahora no tienen csgo.

1 respuesta
L

#25

Pero los guiris de que van?¿ Les van a ir a ellos mejors jugando en nuestros servidores, que nosotros en los suyos, que tenemos una conexion de mierda aqui.

KiRoG4

una pregunta....comos e sabe el ticrate q tiene un sv? poniendo algun comando?

1 1 respuesta
LzO

#27 http://www.mediavida.com/foro/40/sabes-cuanto-tickrate-tiene-tu-server-185355#11

1 respuesta
KiRoG4

#28 esta muy bien explicado pero aun asi no lo entiendo muy bien

segun dice el post hay q mirar donde pone "in" la segunda linea

a mi en "in" me pone esto:

in: 42 7.50k/s

la segunda linea seria 7.50---> entonces ese sv a q ticrate esta? :wtf:

P.D: vale no e dicho nada....acabo de ver una foto en google del net_graph del source, y en el source, si sale lo q dice el post ;)

Massenmorder

#20 que den tick128 que yo sepa solo está Verygames con su Dedigames Pro Xtrem, y Shoot2Survive con sus servidores franceses.

En España casi todas las empresas lo que dan son tick66, o sea una castaña.