Infelizmente no puedo acreditar al autor original, pero si referenciar el post.
El post original se refiere a Overwatch, pero la explicación de como funciona la capa de red de un juego es genérica, por lo que se aplica a Insurgency y por falta de relevancia he omitido las secciones referidas a Overwatch.
Preámbulo:
En practicamente todos los juegos FPS el servidor mantiene el estado del juego. Ésto es imporante para prevenir trampas, pero lleva a algunos problemas que pueden experimentar los jugadores. En el diseño cliente-servidor de un juego, siempre va a existir el problema de una diferencia de estado entre el cliente y el servidor. Ej: El cliente ve una versión retrasada del "Verdadero" estado del juego en el servidor. Ésto siempre va a existir, pero hay algunas cosas que se pueden hacer para hacerlo menos notorio.
Código de red (Netcode)
Es un termino genérico que describe la programación de red de un juego. Es básicamente un termino simple usado para describir el componente de red y no es un término técnico.
Latencia
También conocido comúnmente (e incorrectamente) como ping. Éste es el tiempo que toma a un paquete el viajar desde la computadora del jugador (cliente) al servidor y vise versa (Round Trip Time o RTT). La razón por lo que a la gente lo llama "Ping" es que existe una aplicación llamada "ping" que data de los años 80 y que es utilizada para medir la latencia utilizando algo llamado "Eco ICMP". El comando "ping" se puede encontrar en cualquier sistema operativo con acceso a Internet.
Hay que notar que el viaje en un sentido de un paquete no equivale a mitad del tiempo RTT, pero por simplicidad vamos a asumir que es así. De ahora en adelante vamos a referirnos a la latencia RTT como la latencia y al paquete en un sentido como media latencia.
Tasa de ticks (Tick rate)
El Tick Rate es la frecuencia con la que el servidor actualiza el estado del juego. Ésto se mide en Hertz. Cuando un servidor tiene un Tick Rate de 64, significa que es capaz de enviar paquetes a los clientes a casi 64 veces por segundo. Éstos paquetes contienen actualizaciones del estado del juego, incluyendo cosas como posición de jugadores y objetos. El largo del Tick es solo su duración en mili segundos. Ej: 64 ticks serían 15.6ms, 20 ticks 50ms, 10 ticks 100ms, etc.
Tasa de actualización del cliente (Client Update Rate)
Es la tasa a la cual el cliente está dispuesto a recibir actualizaciones del servidor. Por ejemplo, si la actualización del cliente es 20 y la del servidor es 64, el cliente jugaría como si estuviera en un servidor de 20 ticks. Ésto a menudo se configura localmente pero a menudo hay juegos que no permiten cambiarlo.
Renderización
Es el proceso que realiza el motor gráfico de un juego para generar una imagen.
Cuadros por segundo (Framerate)
El número de cuadros por segundo que el cliente es capaz de renderizar a video. El termino común es FPS (Frames per Second).
Tasa de refresco (Refresh Rate)
El número de veces por segundo que el monitor actualiza lo que renderiza la tarjeta de video. Se mide en Hertz. Si por ejemplo se tiene 30 FPS y el monitor 60Hz, cada imagen generada se mostraría 2 veces en el monitor. Si se tienen 120 FPS en un monitor de 60Hz el monitor solo mostraría 60 de los 120 cuadros renderizados.
Interpolación
Es la tecnología que suaviza los movimientos de los objetos en un juego como por ejemplo: los jugadores. Esencialmente ésto significa que se esta dando fluidez a los movimientos de los objetos entre dos puntos conocidos. El retraso de interpolación es usualmente igual a 2 ticks, pero puede variar.
Por ejemplo, si un jugador corriendo en linea recta en el momento del "Tick 1" estaban a 0.5 metros y si para el "Tick 2" estaban a 1 metro, la interpolación hará que parezca en el cliente como si se hubiera desplazado fluidamente del 0.5m hacia 1m desde la ubicación hacia la que estaba mirando.
El servidor sin embargo, solo lo "ve" realmente en esas dos posiciones, nunca entre medio de las mismas. Sin interpolación, los juegos se verían muy cortados, ya que el cliente solo vera los objetos en el juego a medida que recibe una actualización del servidor.
La interpolación solo ocurre del lado del cliente y esencialmente hace mas lenta la tasa a la que el juego es renderizado a un valor típico igual a 2 ticks (sin embargo hay juegos que permiten cambiar éste valor, como GSGO e Insurgency). Ésto es a lo que la gente se refiere a sus "tasas" (rates). Lo que quieren decir es Actualización de Tasas y retraso de Interpolación. CSGO por ejemplo tiene una interpolación 2x la tasa de actualización o 31ms si la taza de actualización es de 64Hz, posiblemente Insurgency comparta los mismos valores.
"Hit Box"
Es el modelo 3D de un personaje que representa las áreas consideradas como impacto válido. No se pueden ver los hit box, solo se ve el modelo del jugador. Los hit box pueden ser mas chicos o mas grandes o en algunos casos imprecisos, dependiendo de la programación del juego. Ésto puede hacer una diferencia mayor en la percepción de disparos acertados o errados que la tasa de ticks.
Compensación de Lag
Es una función del servidor que intenta reducir la percepción de atraso de un cliente.
Aqui hay un video (ingles) que explica de buen modo como se da la compensación:
Sin compensación de Lag un jugador se tendría que adelantar al objetivo para acertar el disparo, ya que el cliente esta viendo una versión atrasada del mundo del juego.
Esencialmente lo que la compensación de lag está haciendo es interpretando las acciones que recibe del cliente como por ejemplo el disparo de un arma, como una acción del pasado.
La diferencia entre el estado del juego en el servidor y el estado del juego del cliente o "Atraso del cliente" puede ser resumida en: AtrasoDelCliente = (1/2*Latencia)+AtrasoDeInterpolacion.
Un ejemplo de compensación de lag en acción:
- Jugador A ve a Jugador B acercarse a una esquina.
- Jugador A realiza un disparo, el cliente envía la acción al servidor.
- El servidor recibe la acción X mili segundos después, donde X es la media latencia del Jugador A
- El servidor entonces mira en el pasado (en un buffer de memoria), donde estaba parado el Jugador B en el momento que el Jugador A realizó el disparo. En un ejemplo básico el servidor iría hacia atras (Xms+TiempoDeInterpolacionDeJugadorA) para encontrar lo que el Jugador A estaba mirando en ese momento.
Otros valores son posibles dependiendo de como el programador quiera que la compensación de lag se comporte. - El servidor decide si el tiro acertó o no. Para que un disparo sea considerado un acierto, debe alinearse con un hitbox del modelo del jugador. En este caso el servidor considera que fue un acierto incluso si desde la perspectiva del Jugador B, pareciera que ya estaba detrás de la pared. La diferencia de tiempo entre lo que el Jugador B mira y el tiempo en que el servidor considera que el disparo tuvo lugar es igual a: (1/2*LatenciaJugadorA + 1/2*LatenciaJugadorB + TiempoDesdeUltimoTick)
- En el siguiente Tick el servidor actualiza ambos clientes con el resultado. El Jugador A ve el acierto y Jugador B ve su vida decrementada o la muerte.
Nota: En un ejemplo donde 2 jugadores se disparan mutuamente y ambos disparos son aciertos, el juego puede comportarse diferente. En algunos casos como en CSGO, si el primer disparo en arrivar al servidor mata al enemigo, cualquier disparo subsequente es ignorado, es este caso no pueden haber muertes mutuas donde dos jugadores se maten a "1 tick de distancia", Overwatch por ejemplo permite muertes mutuas.
En el modelo de CS:GO, jugadores con mejor latencia tienen una ventaja significativa y puede verse en algunos casos como "Le disparé a ese tipo antes de que me matara, pero no murio!". Incluso se puede escuchar cuando disparamos y aun así no hacerle ningún daño al otro jugador.
En Overwatch por ejemplo, pequeñas diferencias en tiempo de repuesta importan menos, por ejemplo: en un servidor de 64Hz si el Jugador A dispara 15ms mas ràpido que el Jugador B, pero ambos lo hacen antes de los 15.6ms, ambos morirán.
Si la compensacion de lag esta calibrada de mas, resultará en "Disparé detras del objetivo y aún así le acerté" en cambio, si la compensación de lag esta calibrada de menos, resultará en "Dispare delante del objetivo y le acerté".
Generalmente un servidor con una tasa de ticks será mas fluido y la interacción de los jugadores será mas precisa. Téngase en cuenta que un servidor con mayor tasa de tick no afectará como se comporta la compensación de lag, por lo que de todos modos se experimentarán situaciones cuando se corre detrás de una esquina y de todos modos se muere.
Si se está preocupado por el rendimiento de un juego hay una serie de cosas que se deben descartar primero y que pueden hacer la diferencia:
- La conexión a Internet. Cuando mas baja la latencia, mejor. Por eso es importante jugar en servidores donde se tenga la latencia mas baja. También cualquier congestión en el tráfico de Internet en casa pueden causar retrasos. La compensación de lag, ayuda con la parte de a que se está disparando, pero si la latencia es mala se es mas propenso a experimentar el "Corrí detrás de la esquina y aún así me dieron" o el escenario "yo disparé primero y de todos modos morí".
Utilizar cable UTP es siempre mejor que utilizar WiFi. - Si el cliente tiene una baja cantidad de FPS (menor a 60Hz), aumentará la percepción de atraso y a menudo mas notorio que la diferencia que la tasa de ticks puede causar.
- Ajustar la interpolación en los juegos que lo permiten. La mayoría de los juegos tendrán un período de interpolación 2 veces la duración entre ticks, la idea es que si un paquete se pierde, el movimiento de un jugador no se trancará en pantalla. Si la conexión a Internet es buena y no hay pérdida de paquetes, se puede cambiar el período de interpolación mas o menos al valor de la duración del tick, pero si los paquetes se atrasan, se vera trancado. Si el valor es muy bajo puede causar que se vea todo entrecortado.
- Si el juego permite aumentar la tasa de actualización del cliente (update rate), se debería hacer si se quiere un rendimiento óptimo, viene a un costo de mayor uso de CPU y ancho de banda, sin embargo del lado del cliente importa poco a no ser que la conexión a Internet sea de un ancho de banda muy bajo.
- Si se tiene una tasa de refresco de 60Hz en el monitor, probablemente no se pueda notar la diferencia entre un servidor de 64 y 128 ticks, porque el monitor no puede mostrar la diferencia atribuida a la tasa de ticks
Por último, si se sigue a un jugador en "Primera persona" como espectador o utilizando SourceTV, no se verá exactamente lo que el jugador ve, los espectadores ven el mundo sin compensación de lag.

No hay comentarios:
Publicar un comentario