El estado del registro de impactos
Hola, soy Kevin Lee, ingeniero de software y parte del equipo de sistemas de juego de VALORANT. Nuestro equipo se encarga de desarrollar la mayor parte de los sistemas principales sobre los cuales se ejecuta la jugabilidad de VALORANT, incluidos el movimiento, el combate y los comandos. En este artículo hablaremos sobre uno de los sistemas centrales de la jugabilidad de los juegos de disparos: el registro de impactos.
En un juego como VALORANT, el registro de impactos es uno de los sistemas más importantes, puesto que un solo disparo a la cabeza puede definir una victoria o una derrota. Nuestro objetivo como desarrolladores consiste en asegurarnos de que cuando un jugador dispare, el resultado del disparo sea claro, se vea bien y, sobre todo, sea exacto.
En ocasiones, vemos publicaciones o recibimos mensajes por parte de los jugadores con videos en los que el registro de impactos no funciona correctamente. Tomamos muy en serio todos esos reportes y revisamos cada video, cuadro por cuadro, para asegurarnos de que el sistema esté funcionando como corresponde.
Dicho esto, consideramos que el registro de impactos en VALORANT actualmente se encuentra en muy buen estado. Quizá haya algunos casos excepcionales de errores por allí, los cuales siempre revisaremos con la seriedad debida. Buscamos constantemente mejorar la calidad y la claridad de todos nuestros sistemas.
EXACTITUD VS. CLARIDAD
En la versión 0.50 de la beta detectamos un aumento en los reportes relacionados con el registro de impactos. Luego de revisar los reportes y videos de los jugadores, y tras un largo periodo de pruebas internas, pudimos identificar unos cuantos casos de errores excepcionales relacionados con el registro de impactos, pero ninguno de ellos era tan grave como para ameritar tantos reportes. Tras una revisión más detallada, la mayoría de esos videos señalaban problemas con la claridad y no con la exactitud. Los disparos eran procesados correctamente, pero la representación visual del disparo les mostraba un resultado confuso a los jugadores. Esta situación resalta una diferencia importante entre exactitud y claridad.
Si bien ambas son importantes para precisar la ''sensación'' de un disparo...
- La exactitud se refiere al resultado de un registro erróneo de un disparo (por ejemplo, las balas le dan a la cabeza, pero se registra como si le hubieran dado al cuerpo, o los jugadores enemigos aparecen de manera diferente en el cliente en comparación con el servidor).
- La claridad tiene que ver con la presentación de un disparo difícil de decodificar (por ejemplo, una bala golpea el hombro, pero la representación visual lo muestra como si hubiera sido un disparo a la cabeza).
- Los errores de exactitud son peores que los de claridad.
Esperamos que este artículo esclarezca el sistema para que todos puedan ver sus partidas y comprender qué es lo que sucede en pantalla con respecto a los disparos. Les contaremos cómo funciona el sistema en un nivel especializado y detallaremos qué sucede desde el momento en el que presionan el botón de disparo hasta que se muestra el disparo a la cabeza.
Para una descripción técnica aún más detallada, consulta este artículo sobre el código de red de VALORANT en el blog de tecnología de Riot (en inglés).
También presentaremos algunos de los casos más habituales que vemos con los reportes de ''registros de impactos malos'' y trataremos de explicar qué es lo que pasa y lo que estamos haciendo para mejorar la claridad en esas situaciones.
DEL CLIC AL DISPARO A LA CABEZA
Antes de que nos adentremos en lo que sucede cuando disparas, es importante comprender cómo el juego simula lo que está pasando. La jugabilidad de VALORANT se simula dos veces: primero, en el servidor (la autoridad que define cómo se desempeñará esa simulación) y luego en el cliente (en donde los resultados predictivos del servidor hacen que el juego sea más receptivo).
La simulación del juego incluye todo lo que conforma el mundo, como las posiciones de los jugadores, cualquier habilidad que vuele por el aire y el humo del campo de batalla. Con cada cuadro, el juego captura una imagen de la simulación y la usa para representar un cuadro en la pantalla. El servidor también realiza esta captura para cada uno de sus cuadros (aunque omite el paso de la representación, puesto que no hay nadie que esté mirando el servidor).
Imaginemos que un enemigo se asoma por una esquina y gracias a tu increíble posicionamiento de retícula ya la tienes dirigida a su cabeza, así que presionas el botón izquierdo de tu mouse para disparar... ¿Qué sucede?
En el momento en el que presionas una tecla, el comando se envía a nuestro sistema de comandos (sometido a una pequeña cantidad de latencia de hardware/sistema operativo). Con cada cuadro del juego, el sistema de comandos procesará todos los comandos que haya recibido desde el cuadro anterior. Cuando disparas, ese comando de ''disparo'' se envía al servidor junto con una marca de tiempo correspondiente al cuadro en el que sucedió la simulación del disparo.
Es importante señalar que esta marca de tiempo se define a partir de lo que se representa en ese momento en tu pantalla cuando el juego recibe el comando. Ahora nosotros debemos seguir el disparo en dos simulaciones diferentes: la del cliente y la del servidor.
Comencemos con el cliente, es decir, tu computadora. Inmediatamente después de que el disparo se envió al servidor, el cliente comienza a trabajar para mostrar el destello del cañón y el rastreador del disparo. Como mínimo, esto sucederá un cuadro después de tu disparo, ya que el juego necesita representar un nuevo cuadro para tu pantalla. Esto es importante, ya que significa que el cuadro en el que el disparo se procesa NO es el mismo en el que aparece el rastreador, sino que está, por lo menos, un cuadro atrás.
En ocasiones, este proceso puede implicar una falla en la claridad del disparo. La manera más habitual en la que esta falla de sincronización puede resolverse es mediante el retraso de la bala. No lo hacemos porque retrasar la bala añade latencia de entrada, la cual queremos minimizar en VALORANT. Con respecto a la confirmación del impacto, el cliente espera hasta que recibe información del servidor acerca del resultado antes de mostrar la confirmación del impacto. Para garantizar la consistencia entre todos los usuarios y evitar que los tramposos hackeen sus clientes para darles información falsa sobre los resultados de los disparos, los resultados de los disparos son autorizados exclusivamente por el servidor.
Por su parte, el servidor recibe en algún momento un mensaje de parte del cliente indicando que hubo un disparo. Debido a la latencia de Internet, ya pasó un tiempo desde que sucedió ese disparo. Para asegurarse de que el disparo corresponda a la simulación que el jugador ve, el servidor retrocede la simulación a la marca de tiempo otorgada por el cliente antes de evaluar el registro de impactos. Esto incluye retroceder las posiciones del jugador y las posturas de animación. Después, envía el resultado del disparo de vuelta al cliente. Para este ejemplo, ¡digamos que fue un disparo a la cabeza!
El cliente recibirá un mensaje del servidor con el resultado del disparo y luego reproducirá los efectos visuales y de sonido correspondientes. En este caso, serían los efectos visuales y de sonido de un disparo a la cabeza. Debido a que el cliente debe esperar al servidor para comunicar el resultado del disparo, hay un retraso entre el rastreador y los efectos del impacto equivalente al tiempo de ida y vuelta de tu conexión (por ejemplo, 40 ms al servidor equivale a 80 ms de retraso entre el rastreador y los efectos visuales del impacto) más una pequeña cantidad de tiempo de procesamiento. Con latencias más altas, este retraso puede notarse en tiempo real.
Estamos trabajando para mejorar la claridad en estas situaciones.
CASO PRÁCTICO 1: Disparos a objetivos en movimiento
En muchos reportes relacionados con el registro de impactos, vemos que el objetivo del disparo está corriendo. Estudiemos más de cerca lo que sucede visualmente cuando un disparo alcanza con éxito a un objetivo en movimiento. Vemos que el jugador acierta un disparo a la cabeza de un jugador que está corriendo. Para ilustrar el problema con mayor claridad en este ejemplo, el cliente se ejecuta a 60 FPS. Vemos que en el cuadro antes de que el rastreador se dispare, la retícula se alinea con la cabeza del enemigo.
No obstante, en el cuadro desde el que emerge el rastreador, la situación ya no es la misma.
El segundo video muestra el mismo escenario, pero el disparo falla por poco al objetivo. Al mirar el video cuadro por cuadro, vemos que sucede lo opuesto: la retícula ya no está en la cabeza en el cuadro anterior al rastreador, pero sí está en la cabeza en el cuadro en el que el rastreador aparece. A primera vista, podríamos señalar el cuadro con el rastreador y pensar: ''¡claramente era un disparo a la cabeza!''. Al revisar el video o las repeticiones, en realidad necesitamos buscar el cuadro antes de que el rastreador aparezca para obtener una imagen precisa del momento en el que se hizo el disparo.
Volvamos al ejemplo en el que se hizo el disparo y revisemos el cuadro en donde los efectos visuales del tiro se representan. Hay una distancia considerable entre la ubicación actual del jugador y la ubicación de los efectos del disparo debido al retraso causado por la latencia de Internet. Esto puede ser confuso al tratar de entender qué pasó con el disparo, ya que lo más probable es que uno se concentre en la ubicación actual del enemigo y no en su ubicación en el momento del disparo. Esto también lleva a una confusión adicional en las situaciones en las que el enemigo se agacha o se mueve (que revisaremos en el caso práctico 2).
Este caso práctico ilustra la falta de claridad con respecto al sistema de registro de impactos actual. Idealmente, no es necesario entender todos estos antecedentes para tener una lectura clara de la situación. Como desarrolladores, lo sabemos y estamos investigando maneras para mejorar la claridad en estos casos.
CASO PRÁCTICO 2: Efectos visuales al agacharse durante un disparo
Digamos que estás en un combate de armas de larga distancia. Para desgracia de tu futuro yo, mantienes presionado el clic izquierdo y disparas de forma esparcida. Por lo menos una de esas balas será un disparo a la cabeza, ¿verdad? Pero no. Aciertas 3 disparos al cuerpo con el Vandal, lo que inflige 117 de daño, antes de recibir un disparo a la cabeza como respuesta.
Con mucho coraje, revisas el video después de la partida, con la certeza de que hubo un error en el registro de impactos. Ves que el jugador enemigo estaba agachándose para tratar de esquivar tus disparos. Para tu sorpresa, ves los efectos de un impacto sobre su cabeza mientras el jugador se agacha. ¡Pero tu reporte de combate solo confirmó disparos al cuerpo! ¿Qué pasó?
Este es el enlace a una publicación real de Reddit titulada ''Los disparo a la cabeza no se registran cuando un jugador se agacha'' (en inglés) como hipótesis de lo anterior.
Cuando nuestro equipo investiga los reportes sobre registros de impactos erróneos, este tipo de situaciones son la causa más frecuente de lo que parece ser un registro de impactos incorrecto. En realidad, el registro de impactos funciona correctamente; los disparos se dirigen adonde apuntas (ignorando los errores de propagación o movimiento) cuando presionas el botón de disparo. Ese disparo se registra correctamente en el servidor.
Sin embargo, unos cuantos factores diferentes provocan que este caso en particular sea visualmente confuso:
- Los efectos visuales del impacto están retrasados debido a la latencia del Internet.
- Los efectos visuales del impacto aparecen en la ubicación original del impacto del disparo.
- El jugador objetivo se está moviendo (la mayor parte del tiempo, se está agachando).
Para poner otro ejemplo, digamos que el jugador tiene una latencia de 100. El jugador acierta un disparo en el hombro del jugador enemigo. Debido a que debemos esperar a que el servidor confirme el impacto, hay una diferencia de 100 ms de latencia cuando los efectos visuales del impacto se hacen presentes en la ubicación del disparo al cuerpo. Pero, durante esos 100 ms, el jugador enemigo ya comenzó a agacharse y movió su cabeza justo detrás de los efectos visuales del impacto que acaban de aparecer. A larga distancia y en el fulgor de una batalla, los efectos visuales de un disparo al cuerpo pueden confundirse con los efectos visuales del impacto de un disparo a la cabeza.
Esto causó muchos problemas principalmente durante la versión 0.50 de la beta cuando la sangre estaba desactivada inintencionalmente para todos y el destello de nuestros efectos visuales no era tan claro como para distinguir entre los efectos visuales de los tiros a la cabeza y los disparos al cuerpo. Siempre hemos tenido efectos visuales diferenciados para señalar disparos al cuerpo y tiros a la cabeza, pero sabemos que no siempre eran identificados correctamente durante el combate.
Esta es una falla en la claridad del registro de impactos que estamos tratando de mejorar. Algo con lo que estamos experimentando es emparejar los efectos visuales de un impacto en el cuerpo con la parte del cuerpo del personaje en donde recibió el impacto, para que haya una relación clara, incluso con una latencia alta.
Comparación entre los efectos visuales de nuestro disparo a la cabeza sin sangre actual con los efectos visuales del disparo en el cuerpo:
PLANES DE MEJORAS A LA CLARIDAD
Los dos casos prácticos señalan algunas áreas en las que nuestros efectos visuales de confirmación de impactos se quedan cortos. Uno de los cambios que estamos probando es el de hacer que los efectos de la sangre y los destellos aparezcan en la posición actual del personaje, en correspondencia con la parte del cuerpo que recibió el impacto, de manera que los siga mientras se mueven. Esta opción incrementa bastante la claridad en situaciones como el caso práctico 2 con los enemigos que se agachan, porque el efecto visual se moverá en conjunto con los movimientos de su cuerpo.
Una desventaja de esta solución es que sería posible que los efectos visuales de confirmación de impacto se muevan junto con el personaje cuando se esconde detrás de algo. Pensemos en el caso de un jugador con 100 ms de latencia que dispara a otro jugador que se asoma por una esquina. Si consigue acertar un disparo en el enemigo y este inmediatamente se mueve detrás de la esquina antes de que llegue la confirmación del impacto desde el servidor, puede ser que el jugador que disparó no sea capaz de ver la confirmación del impacto cuando aparece.
Hemos considerado añadir varias partículas, algunas que sigan al personaje y otras que aparezcan inmediatamente en la ubicación del impacto, basándonos en la simulación del cliente para reducir este problema. Sin embargo, esto puede causar confusión si las simulaciones entre el cliente y el servidor no coinciden en el resultado de un disparo: los efectos deben ser claros con respecto a lo que representan para que sea fácil comprender el resultado de un disparo.
Trabajaremos en esta y otras mejoras a la claridad, y esperamos poder compartir una serie de actualizaciones sobre este tema próximamente.
NO DEJES DE ENVIARNOS VIDEOS
Esperamos que este artículo ayude a comprender cómo funciona el registro de impactos en VALORANT y por qué los disparos aparecen de esa forma. No dejes de enviarnos videos en los que consideres que el registro de impactos se comporta de manera inadecuada. Haremos todo lo posible por revisar todos los reportes.
Incluso si no hay ningún problema visible, nos ayuda a rastrear los errores de exactitud del registro de impactos más rápido cuando ocurren (también nos espantamos cuando leemos la frase ''registro de impactos'' en una publicación popular de Reddit).
En este enlace hay un ejemplo de un error en la exactitud del registro de impactos en Reddit (en inglés).