Cómo funciona el juego en línea de 2XKO

Gracias a la tecnología, jugar en línea es igual de justo, rápido y divertido que jugar en modo local.

¡Hola, comunidad! Soy Tony Cannon, ingeniero principal de software sénior de 2XKO. En este artículo, les contaremos sobre lo que hacemos para crear una experiencia gratificante de juego en línea.

Hablaremos mucho sobre tecnología, así que aquí tienen un resumen por si lo necesitan:

  • Queremos que jugar en línea sea tan seguro como sea posible y que no haya lag. Para lograrlo, utilizamos muchos sistemas diferentes, como una arquitectura cliente-servidor, un código de red rollback y un sistema al que apodamos "modo Juego Limpio"
  • Nos tomamos muy en serio la lucha contra las trampas. Por lo tanto, emplearemos Riot Vanguard con el fin de garantizar que sus rivales sean personas reales y no scripts.
  • Estamos utilizando muchas herramientas nuevas para que funcionen los sistemas en torno al juego.
    • Usamos algo llamado "servidor de validación de partidas" para ejecutar una copia de cada partida en la nube, lo que permite el funcionamiento del sistema antitrampas, la clasificación por niveles de habilidad y el modo espectador.
    • Ahora, el emparejamiento busca partidas en todas las salas para que encuentren oponentes rápido incluso si su sala tiene poca gente.

Ahora sí, ¡comencemos!

Creado para jugar en línea

Desde que comenzamos a trabajar en 2XKO, el juego en línea fue uno de los ejes principales de desarrollo. Nuestra mayor prioridad al crear la tecnología básica era integrar GGPO y llevar a cabo todas las pruebas de juego en línea. Aunque en ese entonces 2XKO funcionaba con una red entre pares (o peer-to-peer), ensamblamos y ejecutamos un servidor proxy de paquetes en el centro de datos de Riot en Las Vegas para que las pruebas de juego diarias tuvieran lugar mediante una conexión de Internet real. Es muy importante tener todo esto en cuenta en la fase de diseño. Por eso, los movimientos, los combos, las animaciones y los efectos de los personajes se desarrollaron y se probaron teniendo en cuenta el modo en línea para asegurarnos de que esa experiencia de juego fuera tan buena como la del modo sin conexión.

Arquitectura cliente-servidor

A medida que avanzaba el desarrollo, pasamos de una arquitectura entre pares a una cliente-servidor, impulsados tanto por la necesidad de permitir partidas de cuatro personas como por el objetivo de lograr un rendimiento y una escalabilidad más estables. En las partidas de cuatro personas, cada una envía y recibe alrededor de un tercio de tráfico menos gracias a la topología servidor-cliente, lo que reduce los requisitos de ancho de banda, disminuye la posibilidad de perder paquetes y garantiza un rendimiento más fluido incluso cuando la conexión no es tan estable. Sin embargo, hay muchas más razones por las que preferimos esta arquitectura.

Privacidad y protección de las IPs

El principal y mayor beneficio de la arquitectura cliente-servidor es que quienes juegan 2XKO jamás exponen su dirección IP a los demás. Este es uno de los mayores riesgos de la arquitectura entre pares: al jugar contra alguien más, su rival obtiene un vector de ataque que puede explotar para saturar su red con paquetes (contenido en inglés) con el fin de obligarlos a desconectarse y aceptar la derrota. Como si esto fuera poco, la topología entre pares también aumenta el riesgo de ser víctima de un ataque de doxxing (también conocido como "doxeo"). La seguridad de quienes confían en nosotros es algo que el equipo se toma muy en serio, y pasar a un modelo cliente-servidor es la forma más eficaz de proteger su IP. 

Jerarquía de los tiempos y los controles

El servidor desempeña otra función muy importante en el sistema: actúa como referencia para los controles, los estados y los tiempos. Durante el desarrollo, luego de lograr que el rollback funcione, lo que en verdad define la calidad del código de red es cuán fiable resulta el algoritmo a la hora de equilibrar la "brecha". En otras palabras, hay que asegurarse de que todo el mundo comparta la misma cantidad de rollback. Si yo tengo un rollback de tres fotogramas, el oponente debería experimentar lo mismo. Sin embargo, si yo tengo un rollback de cinco fotogramas y el rival tiene uno de un solo fotograma, es probable que la brecha no esté equilibrada. 

Sin entrar en demasiados detalles, equilibrar la brecha implica sincronizar el tiempo de 2XKO de todas las personas que lo juegan, sincronizar el motor del juego para todos los jugadores de una partida. Esto de por sí ya es complicado de lograr en una partida entre dos individuos conectados mediante el sistema entre pares. ¿Cómo nos aseguramos de que ambas personas estén recibiendo la misma información? (Momento nerd: Este asunto está relacionado con el problema de los dos generales y probablemente sea imposible de resolver, pero permítanme divagar un poquito). En una partida con cuatro jugadores, ¡la brecha nos da aun más dolores de cabeza! 

Por eso, necesitamos que el servidor sea el que define los tiempos. Al establecer una referencia principal que rija el reloj de todo aquel que participa en una partida, podemos lograr un mayor equilibrio dentro del juego.

Modo Juego Limpio

En este momento, estamos desarrollando otra función para mejorar la experiencia en línea de 2XKO: el modo Juego Limpio. Todos hemos jugado partidas contra personas que utilizan Wi-Fi, los datos del celular o una computadora que no cumple con los requisitos mínimos, ¿verdad? ¿Y qué ocurre en esos casos? El juego se traba, comienza a haber lag o comienzan los tirones gigantes a causa del rollback y los personajes empiezan a teletransportarse por toda la pantalla. En una partida mediada por la topología entre pares, no hay forma de escapar de este problema. Si los botones que presionan los jugadores no se procesan a tiempo, ni siquiera el rollback es suficiente para proporcionar una experiencia fluida. Esto se vuelve mucho más problemático si tenemos en cuenta que hay personas con malas intenciones que podrían aprovecharse de la situación: alguien con ganas de hacer trampa podría crear un lag-switch o "interruptor de latencia" e incorporarlo a su control para provocar pérdidas de paquetes de datos a voluntad, o incluso aprovechar la barra de título de Windows para detener la partida. Ambas acciones provocarían una cantidad insoportable de lag que seguro interrumpiría su combo en el peor momento. 

Cuando el modo Juego Limpio está activado, el servidor de 2XKO le otorga a cada persona que participa en la partida un breve período de gracia para que se procesen los botones que presionaron. Si el servidor no recibe los datos a tiempo, el sistema replica el último comando que recibió y la partida continúa. Esto es algo muy importante, ya que así su experiencia de juego no se verá afectada por lo que su oponente haga con su red. Si el rival activa un interruptor de latencia o tiene un problema con la conexión de Wi-Fi, es probable que ustedes ni lo noten. No obstante, esto es un arma de doble filo. Si su conexión de Internet falla durante unos segundos, puede que terminen recibiendo un gran combo de parte del equipo enemigo.

El modo Juego Limpio todavía está en fase experimental, y nos llevará bastante tiempo ajustarlo para que funcione bien. Queremos asegurarnos de que castigue a los tramposos que intentan obtener ventaja forzando la pérdida de paquetes sin perjudicar al resto de las personas por accidente. Cuando esté listo para que lo implementemos en el juego, les avisaremos para que nos den su opinión al respecto.

Infraestructura y protección global

Obviamente, todas las mejoras de conexión que proponemos no servirían de nada sin una fuerte estructura global que las respalde. Por lo tanto, aprovecharemos al máximo la capacidad de la infraestructura de red de Riot para llevar a cabo nuestros planes. El tráfico de red de 2XKO utilizará la red troncal de Riot Direct (contenido en inglés) para asegurarnos de que los paquetes de datos de quienes juegan lleguen al servidor con una latencia menor que la de Internet. Los servidores están protegidos por el Servicio General contra Ataques DDoS, lo que impide que las personas malintencionadas interrumpan la gran final del torneo que decidieron organizar en una sala privada. Además, utilizaremos la plataforma provisional para juegos de Riot (contenido en inglés) para montar servidores en todo el mundo y garantizar partidas con baja latencia en todas las regiones que formen parte del lanzamiento de 2XKO. Nuestro objetivo es que haya servidores cerca de todos los miembros de la comunidad sin importar dónde estén, pero puede que nos lleve un tiempo lograrlo. ¡Agradecemos su paciencia mientras continuamos creciendo!

Sistema antitrampas de Riot Vanguard

Dado que la competencia justa en línea también depende de la integridad del juego, combinaremos una red sólida con una protección antitrampas igual de eficaz. Para combatir las trampas, utilizaremos Vanguard, una herramienta cuyo objetivo es dificultar la labor de quienes crean scripts y bots. Vanguard ha dado muy buen resultado y logró reducir la cantidad de bots en LoL en más de un 99%. Gracias al sistema antitrampas, podremos comprobar que sus oponentes sean seres humanos reales y que no usen trampas para contrarrestar sus ataques o castigar sus golpes fallidos de forma automática. Dicho esto, somos conscientes de que preservar la integridad competitiva no es algo que se resuelva de un día para el otro: es un esfuerzo continuo. Seguiremos vigilando el comportamiento de las personas malintencionadas y adaptaremos nuestro enfoque según sea necesario.

Latencia de comandos fija y sincronización de fotogramas

Además de todo lo anterior, regularemos los subsistemas de latencia de comandos y de sincronización de fotogramas para que la experiencia de juego de 2XKO sea lo más estable posible, independientemente de la plataforma o la modalidad en que jueguen. 

Latencia de comandos fija

El primer truco que utilizamos fue añadir una latencia fija de tres fotogramas a todos los comandos. Esta es una técnica muy común en los juegos de pelea que permite minimizar la duración del rollback. En 2XKO, aplicamos esta demora tanto en los modos en línea como en los modos locales con el fin de que la coordinación y la memoria muscular que adquieran al practicar sus combos en un modo sin conexión se traslade directamente a las partidas en línea. Hace varios años que decidimos que la cantidad justa de rollback son tres fotogramas. Todo, desde el instante en que se castiga un golpe fallido hasta el movimiento más rápido del juego, se diseñó y se probó teniendo en cuenta una demora universal de tres fotogramas, así que la experiencia de juego sigue siendo excelente a pesar de la latencia. 

Sincronización de fotogramas

El segundo truco que implementamos fue dedicarle mucho tiempo a la sincronización de fotogramas, la característica que define la rapidez y la estabilidad con la que se puede simular, renderizar y mostrar un fotograma. Si la sincronización no es uniforme, puede que la imagen parpadee o que, a veces,los combos con enganche de 1 fotograma no se procesen aunque hayan hecho bien las cosas. Nos enfocamos en minimizar el desfase entre los comandos que se ingresan y las acciones que se muestran en pantalla, además de reducir las diferencias entre PC y consolas. Ahora, el intervalo entre el momento en que presionan un botón y ven la respuesta en el juego es prácticamente el mismo en PC, PS5 y Xbox. Esto significa que 2XKO ofrece siempre la misma experiencia sin importar si están jugando sin conexión, en línea, en una PC en casa o en una consola en un evento presencial.

Servidor de validación de partidas (GVS)

Antes mencioné que el servidor del juego actúa como referencia para el estado de las partidas, pero no expliqué exactamente qué significa eso. El principal beneficio de esta característica es contribuir en la lucha contra los tramposos y las cuentas smurf. Cada partida competitiva de 2XKO ejecuta en paralelo una copia de sí misma en el servidor. Por lo tanto, en un enfrentamiento 2v2, hay una quinta instancia de la partida ocurriendo en tiempo real en la nube. A este proceso se lo conoce como "servidor de validación de partidas" o GVS por sus siglas en inglés. 

El GVS nos otorga ventajas considerables. Primero, el solo hecho de tener un servidor para el juego nos permite identificar con precisión a quién debemos sancionar si alguien abandona la partida o se desconecta adrede. Sin embargo, el GVS lleva esta idea un poco más allá: si la copia de la partida de un jugador es diferente a la de los demás debido a una modificación tramposa, podemos identificar a la persona que hizo trampa comparando el checksum del estado de su partida con la del GVS. Así, prevenimos que se fuerce un empate mediante una modificación intencional el estado del enfrentamiento. 

El GVS también provee resultados de búsquedas de emparejamiento y los incorpora al flujo de datos de salida de nuestro sistema. Para ilustrar esto, les daré un ejemplo. Nosotros alimentamos el servicio centralizado de clasificación de Riot con estadísticas detalladas de todas las partidas. El servicio de clasificación suministra las estadísticas de final de la partida a través del algoritmo TrueSkill 2 de Microsoft, que ayuda a determinar el nivel de habilidad de alguien en tan solo un par de partidas. Por lo tanto, este proceso permite disminuir la cantidad de partidas desiguales y frustrantes, y esperamos que también reduzca drásticamente el uso de cuentas smurf.

Salas y modo espectador

Más allá de la jugabilidad principal de 2XKO, pusimos un montón de esfuerzo en los sistemas que giran en torno a las partidas. El más importante de ellos es el de las salas. Los juegos de pelea son más divertidos cuando se juegan con amistades en casa o en un recinto durante un torneo o un encuentro semanal; las salas de 2XKO se diseñaron para replicar esos círculos sociales en línea.

Partidas en curso

Una de mis funciones favoritas dentro de 2XKO es la que permite ver cualquier partida en curso. Observar a otras personas jugar es uno de los aspectos más importantes de las reuniones presenciales. Es una buena forma de aprender técnicas nuevas para personajes específicos, ver qué tácticas usan los demás o simplemente alentar a sus amistades mientras luchan contra el rival que los eliminó a ustedes del torneo. Queríamos que todas esas sensaciones maravillosas quedaran plasmadas en el juego en línea.

Cuando una persona en una sala de 2XKO se acerca lo suficiente a una maquinita que cuenta con una partida en curso, aparece una pantalla sobre los avatares que, en pocos segundos, permite ver el estado actual de la partida. Ya sea en la selección de campeón, al comienzo de la partida o al tratar de asestar ese golpe de gracia decisivo al final de la última ronda, podrán ver exactamente lo mismo que quienes están luchando y casi en tiempo real (sin sufrir extensas demoras de sincronización o de reproducción) para sumergirse de lleno en la acción como si hubieran estado ahí desde el principio.

Cómo funciona el servidor durante el modo espectador

Tuvimos que experimentar bastante para concebir el sistema de espectador actual. Los juegos de pelea que usan tecnología de rollback (como 2XKO) son totalmente deterministas, por lo que siempre se puede repetir el estado de la partida con solo ejecutar los comandos adecuados. Si alguien se acerca a una maquinita y se pone a ver la partida desde el comienzo, le permitimos ver los movimientos que efectúan los demás en tiempo real y listo. Pero ¿qué sucede si quieren ver una partida que ya va a la mitad? En ese caso, podríamos darle acceso a cada espectador a todos los comandos que se ejecutaron y adelantar la repetición hasta llegar a lo que está sucediendo en ese momento… pero eso llevaría demasiado tiempo. De hecho, las primeras versiones de las salas de 2XKO, antes de Alpha Lab 1, eran así. El sistema funcionaba, pero no era óptimo. Que hubiera que esperar entre 5 y 20 segundos a que la pantalla se actualizara desalentaba el uso del modo espectador.

Sin embargo, cuando implementamos el GVS, tuvimos la oportunidad de hacer algo más eficiente. Recuerden: El GVS es el sistema que valida el estado de la partida en tiempo real en el servidor. Cuando alguien comienza a ver una partida en curso, no le mostramos todos los comandos que se ingresaron desde el principio del combate. En vez de eso, le solicitamos al GVS que haga una captura del estado actual de la partida y que empiece a compartir los comandos a partir de ese momento. Una captura de estado es un estado de guardado que ocupa poca memoria y que solo registra los datos deterministas del sistema. Como solo pesa 50 KB, se transmite rapidísimo a quienes quieren ver la partida. En vez de adelantar a través de tres minutos de comandos, solo hay que cargar la captura de 50 KB y todo aquel que quiera ver qué sucede ingresará al instante en la partida en curso. Al menos para mí, eso es magia.

Por supuesto que no podríamos haber ideado esta función sin haber simulado las partidas en el servidor primero. En los prototipos del modo espectador, tomábamos la captura de estado de la partida desde la perspectiva de la primera persona que estaba peleando y se la enviábamos al espectador, lo que causaba todo tipo de problemas. Para empezar, crear la captura de estado y comprimirla consume muchos recursos. En computadoras de bajo rendimiento, daba como resultado bajones de FPS para el jugador en cuestión cada vez que se sumaba un espectador. Eso es inaceptable. Imagínense que todos los ataques que intentan asestar no golpean al rival solo porque alguien se puso a ver su partida en el momento equivocado. Además, es inseguro. No queríamos crear una vulnerabilidad que algún rufián pudiera explotar, tanto si fuera para crear una captura de estado falsa que desbordara el búfer como para manipular de cualquier otra manera la máquina de alguien más. Todos los problemas que mencioné se evitan trasladando por completo la fuente de los datos para los espectadores a una fuente de confianza alojada en el servidor.

Emparejamiento multisala

El último aspecto que quería tratar en este artículo es la función de emparejamiento multisala. Hay varias formas de buscar partida en 2XKO: desafiar directamente a una persona en particular; esperar en una maquinita a que alguien se les siente al lado, inserte una moneda y se ponga a jugar con ustedes (como en los viejos tiempos), o pedirle al sistema de emparejamiento que busque a un rival. 

En general, esto último funciona bien cuando la sala está llena, pero hay algunas excepciones. ¿Qué pasa si todas las personas de la sala están pasándola súper y ustedes son los únicos que están buscando partida? 

En Alpha Lab 1, jugar en una sala tenía un montón de cosas cool, tales como las tablas de posiciones, las rachas de victorias y los espectadores casuales. Sin embargo, esos beneficios a veces venían en detrimento del tiempo que se tardaba en entrar en una partida en horarios de baja concurrencia. De hecho, para quienes solo querían encontrar una partida en línea lo más rápido posible, era más eficaz optar por una opción como "Buscar partida" (como la que aparece en el menú principal) que buscara contrincantes en todas las salas, no solo en la actual. 

En la beta cerrada, modificamos el sistema de emparejamiento para que busque partida en todas las salas disponibles. Si encuentra una partida en la sala actual, reserva una maquinita de dicha sala y envía a los competidores ahí. Si encuentra una partida con alguien de otra sala, la experiencia es más o menos la misma: todas las personas, cada una en su sala, recibe una reserva en una maquinita para jugar y se genera un avatar holográfico del rival que se sumará al combate. Cuando termina el enfrentamiento, todo el mundo vuelve a su respectiva sala de origen. Y no se preocupen por su racha de victorias; no la perderán. 

Como los miembros de todas las salas de una misma región ingresan al mismo emparejamiento multisala, es mucho más rápido buscar una sala de esta forma que hacerlo desde el menú principal, sin recurrir al sistema de salas. Además, ajustamos el emparejamiento y ahora encuentra la partida óptima para ustedes dentro de cierto lapso de tiempo. Si es un horario donde hay mucha gente conectada, podrán acceder a una partida acorde a su nivel luego de algunos segundos. Si son las tres de la mañana y no hay mucha gente contra la que jugar, el emparejamiento hará su mejor esfuerzo para conseguirles una partida cuanto antes, pero puede que la diferencia en el nivel de habilidad sea más marcada que en otros momentos. La experiencia de emparejamiento lento fuera del horario de mayor concurrencia no es exclusiva de 2XKO: es algo que afecta los sistemas de cualquier juego en línea cuando hay menos cantidad de personas para jugar. Podemos ajustar más el balance de prioridad entre la demora para entrar a una partida y la diferencia en el nivel de habilidad de los jugadores, pero, para eso, nos gustaría saber cuál fue su experiencia con el emparejamiento. Queremos optimizar el sistema tanto como sea posible para el acceso anticipado.

Planes para el futuro

Abarcamos muchísimos temas en este artículo, así que les agradezco si leyeron todo y llegaron hasta aquí. Tenemos la convicción de que la experiencia en línea no puede ni debe quedar en segundo lugar cuando se trata de juegos de pelea. Cada función que incorporamos, desde la validación del servidor y el ajuste del rollback hasta el modo espectador inmediato y el sistema de emparejamiento multisala, se diseñó para que jugar en línea sea igual de justo, rápido y divertido que jugar sin conexión. Dicho eso, aún estamos probando cosas, implementando ajustes e incorporando sus comentarios de cara al acceso anticipado y todo lo que vendrá después. Queremos que nos cuenten detalles sobre su experiencia de juego para seguir mejorando, ¡y no dejen de enviarnos reportes de errores y sugerencias!

¡Gracias por leer!

Tony Cannon