Cómo gestiona 2XKO el juego online
¡Buenas, peñita! Tony Cannon al habla. Soy el ingeniero principal sénior de software de 2XKO. En esta publicación, vamos a echar un vistazo entre bambalinas para mostraros todo lo que estamos haciendo para ofreceros la mejor experiencia de juego online posible.
Hoy tenemos mucha tela que cortar, así que aquí tenéis un resumen:
- Para nosotros es crucial que el juego online sea una experiencia tan segura y sin lag como sea posible. Hacemos uso de todo tipo de sistemas para lograrlo, como una arquitectura cliente-servidor, rollback netcode y lo que llamamos Modo juego limpio.
- Nos tomamos las trampas muy en serio. Así pues, estamos empleando Riot Vanguard para asegurarnos de que vuestros oponentes sean personas humanas que no usan scripts.
-
Estamos utilizando un montón de herramientas nuevas para que los sistemas complementarios funcionen como es debido.
- Empleamos algo llamado "servidor de validación de partidas" para ejecutar una copia de cada partida en la nube, lo que refuerza el sistema antitrampas, el cálculo del rango y el Modo espectador.
- Ahora, el sistema de emparejamiento puede buscar partidas en otras salas, así encontraréis oponentes en un santiamén por mucho que vuestra sala esté desértica.
Dicho esto... ¡Entremos en materia!
Sentar las bases del juego online
Desde que empezamos a desarrollar 2XKO, hemos puesto mucho énfasis en el juego online. Cuando nos pusimos a establecer la tecnología fundamental que usaríamos, la primera prioridad fue integrar GGPO y probar el juego siempre en línea. Aunque en ese momento el juego usaba el P2P (peer-to-peer), creamos y ejecutamos un proxy de paquetes en el centro de datos de Riot en Las Vegas para que todas las pruebas de juego diarias se realizaran en línea. Es tremendamente importante sentar esta base en la fase de diseño. Los movimientos, las combinaciones, las animaciones y los efectos de cada personaje se crearon en primera instancia para el juego en línea y en esas condiciones se probaron. De esta forma, podíamos garantizar que el juego online funcionase tan bien como el offline.
Arquitectura cliente-servidor
A medida que seguimos desarrollando el juego, pasamos de la arquitectura P2P a una de cliente-servidor. Este cambio vino propiciado por las exigencias de las partidas de cuatro jugadores y por nuestro afán de alcanzar un rendimiento más consistente y permitir una mejor adaptabilidad. En una partida de cuatro personas, cada jugador envía y recibe alrededor de una tercera parte del tráfico en el servidor del cliente del que enviarían y recibirían en una configuración P2P. Esto reduce los requisitos de ancho de banda, minimiza la pérdida de paquetes y mejora el rendimiento incluso con conexiones menos estables. No obstante, hay muchas más razones por las que usamos esta arquitectura cliente-servidor.
Privacidad y protección de la IP
Lo primero y más importante: al utilizar una arquitectura cliente-servidor, los demás jugadores no pueden acceder a vuestra dirección IP. Este es uno de los mayores peligros del peer-to-peer. El mero hecho de jugar contra otro jugador le brinda una vía de ataque para inundar vuestra red con paquetes, lo que provoca una desconexión a la fuerza y os hace perder la partida. Es más, dejar la IP de un jugador expuesta lo expone al doxeo (que sus datos personales sean revelados). Nos tomamos muy en serio la seguridad de nuestros jugadores, y trasladar el juego a una arquitectura cliente-servidor es la manera más efectiva de proteger vuestras IP.
Autoridad sobre el tiempo y los comandos
El servidor desempeña otro papel crucial en este sistema: rige los comandos, el estado y el tiempo. Como desarrollador, cuando has logrado implementar el rollback, el mayor factor que afecta a la calidad del netcode es lo bueno que es tu algoritmo a la hora de reducir la "brecha". Esto se traduce en asegurarse de que los jugadores compartan la misma carga del rollback. Si yo veo un rollback de tres frames, el otro jugador debería ver lo mismo. Si yo veo rollbacks de cinco frames y el otro jugador los ve de un frame, esto significa que hay demasiada brecha.

Sin entrar demasiado en tecnicismos, reducir la brecha significa sincronizar los relojes del juego de todos los jugadores de la partida. De por sí, esto ya es muy complicado de conseguir en un juego P2P de dos jugadores. ¿Cómo te aseguras de que ambos jugadores dispongan de la información? (Nota de friqui: esto tiene que ver con el problema de los dos generales, y seguramente sea imposible de resolver, pero no nos vayamos por las ramas...). En una partida de cuatro jugadores, ¡es un quebradero de cabeza aún mayor!
Esto es lo que significa que el servidor rija el tiempo. Al tener una autoridad central que controle el reloj de todos los jugadores de la partida, podemos centrarnos en reducir la brecha para todo el mundo.
Modo juego limpio
Estamos desarrollando otra característica para mejorar la experiencia online de 2XKO. La llamamos "Modo juego limpio". Todos hemos tenido partidas contra gente que juega con wifi o en un móvil compartiendo datos o en un ordenador que no acaba de llegar a los requisitos mínimos. ¿Qué pasa entonces? Que la partida se pausa, va a trompicones o aún peor: hay unos rollbacks gigantescos que hacen que los personajes se trasladen de repente aquí y allá. En un juego P2P, estás atado de manos. Si no riges el tiempo de los comandos de todos los jugadores de la partida, no puede salvarte ni el rollback. Esto resulta especialmente problemático cuando los tramposos se añaden a la ecuación. Un tramposo puede añadirle un interruptor de latencia a sus controladores para provocar una pérdida de paquetes a su antojo o arrastrar la barra de título de Windows en PC para pausar el reloj de su partida. Ambos provocan un pico de lag tremendo que os hará pifiar vuestro combo en el peor momento.
Cuando el Modo juego limpio está activo, el servidor de juego de 2XKO concede un breve periodo de gracia para permitir que los comandos de los jugadores lleguen al servidor. Si los comandos llegan tarde, se repite el último comando del jugador y la partida sigue su curso. Esto resulta muy importante, ya que significa que, independientemente de lo que le suceda a la conexión del rival, vuestra experiencia de juego no se verá afectada. Si activa su interruptor de latencia o su wifi se corta, no os daréis ni cuenta. Aun así, esto es una hoja de doble filo. Si vuestra conexión falla durante unos segundos, puede que de repente os comáis un combo larguísimo del rival.
El Modo juego limpio sigue en fase experimental, por lo que nos queda mucho ensayo y error por delante para perfeccionarlo. Queremos asegurarnos de que penalice a los tramposos que intenten obtener una ventaja injusta provocando pérdidas de paquetes, pero sin que eso perjudique la experiencia del resto de jugadores. Os haremos saber cuando lo hayamos implementado por completo para que nos deis vuestra opinión al respecto.
Infraestructura global y protección
Todas estas mejoras a la conexión de red no servirían de nada sin unos buenos cimientos sobre los que sentarlas. Así pues, aprovecharemos toda la potencia de la infraestructura de red de Riot para mantener todo esto en pie. El tráfico de red de 2XKO usará la red troncal de Riot Direct para que vuestros paquetes lleguen al servidor casi al instante. Los servidores en sí están protegidos por el servicio generalizado contra ataques DDoS, por lo que nadie debería poder arruinaros esa gran final de un torneo que habéis organizado en una sala privada. Utilizamos la plataforma de juego provisional de Riot para implementar servidores por todo el mundo y garantizar partidas con baja latencia para todos los jugadores en las regiones donde se lanzará el juego. La idea es que haya servidores cerca de todos los jugadores a nivel mundial, pero no será algo que conseguiremos de la noche a la mañana. Agradecemos vuestra paciencia mientras vamos implementándolos.
Sistema antitrampas Riot Vanguard
Que la competición online sea justa también depende en gran medida de la integridad, por lo que complementaremos nuestra robusta arquitectura de red con un sistema antitrampas igual de robusto. Usaremos Vanguard para hacerles la vida imposible a los jugadores que usen scripts o bots. Vanguard ha resultado de lo más efectivo a la hora de reducir un 99 % el número de jugadores con bots en LoL. Esto será de gran ayuda para garantizar que vuestros oponentes sean humanos que no usan trampas, como secuencias de comandos de parada automática o castigos por fallo. Dicho esto, preservar la integridad competitiva no es algo que solucionas una vez y te olvidas de ello, sino que es un esfuerzo continuo. Por ello, permaneceremos atentos e iremos adaptando nuestro enfoque según veamos necesario.
Retardo fijo de comandos y ritmo de frames
Estamos regulando nuestros subsistemas de retardo de comandos y ritmo de frames con el fin de garantizar una experiencia de juego tan coherente como sea posible, sin importar si jugáis online o no, o si jugáis en PC o consola.
Retardo fijo de comandos
El primer truquillo que usamos es añadir un retardo fijo de tres frames a todos los comandos. Esta técnica se emplea habitualmente en los juegos de lucha para minimizar la longitud del rollback. En 2XKO, este retardo se aplica tanto online como offline. De esta forma, la sincronización de los combos y la memoria muscular que habéis desarrollado practicando offline pueden aplicarse directamente en vuestras partidas online. Ya hace años que nos decidimos por el retardo de tres frames. Absolutamente todo, desde el momento en el que se puede castigar al oponente por un fallo hasta el movimiento más rápido del juego, se ha desarrollado y probado teniendo en cuenta el retardo de tres frames. Así, el juego no chirría a pesar del retardo.
Ritmo de frames
El segundo truquillo es apostar fuerte por el ritmo de frames. El ritmo de frames es la rapidez y la consistencia con las que se simula, renderiza y muestra un frame. Si el ritmo de frames es variable, empiezan a producirse cortes de vídeo, y a veces no acertáis esos enlaces de un frame que sabéis que habéis ejecutado a la perfección. En lo que respecta al ritmo de frames, nos hemos centrado en minimizar el retardo de registro de comandos y las discrepancias entre consola y PC. Ahora mismo, el tiempo que transcurre entre pulsar un botón y ver ese comando reflejado en pantalla es prácticamente idéntico en PC, PS5 y Xbox. Como he mencionado antes, esto hará que jugar a 2XKO se sienta de la misma manera, tanto si jugáis online como si no, y tanto si jugáis en un PC en casa como en una consola en un evento presencial.

Servidor de validación de partidas (GVS)
Antes he dicho que el servidor del juego rige el estado, pero no me he parado mucho a explicar qué significa eso. Los principales beneficiados son los sistemas antitrampas y antismurfs. En todas las partidas competitivas de 2XKO se está ejecutando otra copia del juego en el servidor. Así pues, en una partida 2v2, hay una quinta copia del juego ejecutándose en la nube en tiempo real. A esto lo llamamos "servidor de validación de partidas" (GVS, por sus siglas en inglés).
El GVS nos proporciona unos beneficios muy significativos. Primero, a causa de la naturaleza de un servidor, podemos identificar con precisión a quién debemos castigar si alguien se ha picado y ha abandonado la partida o ha tirado del cable. El GVS nos permite llevarlo un paso más allá: si la copia del juego de un jugador es distinta a la del resto porque ha sido modificada, podemos identificar a dicho jugador comparando su suma de comprobación del estado de la partida con la del GVS. De esta forma, impedimos que los tramposos fuercen un empate modificando de forma intencionada el estado de la partida.
Además, el GVS transmite los resultados de las partidas a nuestro flujo de datos. Por ejemplo, enviamos estadísticas detalladas de cada partida a los servicios de clasificación centralizados de Riot. El servicio de clasificación contribuye a nuestras estadísticas de final de partida mediante el algoritmo True Skill 2 de Microsoft, que acota y precisa el rango de un jugador en solo un puñado de partidas. Esto os evita el sufrimiento de las partidas desigualadas y esperamos que también reduzca de manera drástica el uso de cuentas smurf.
Salas y Modo espectador
Nos hemos esmerado mucho en la experiencia de juego básica, pero también hemos hecho un esfuerzo titánico con los sistemas complementarios. De entre ellos, el más importante es el sistema de salas. Los juegos de lucha son la bomba cuando los juegas con tus amigos en casa o en un local para participar en un torneo o encuentro semanal. Las salas de 2XKO están pensadas para imitar estos sistemas sociales, pero en línea.
Partidas en curso
El Modo espectador es una de mis características favoritas. Poder ver a otras personas jugar es uno de los pilares fundamentales del juego offline. Sirve mucho para aprender nuevas técnicas de tu personaje, ver qué herramientas usan o simplemente para animar a vuestros amigos y desear que pierda con todas tus fuerzas ese rival que os echó del torneo. Queríamos plasmar todos estos fantásticos sentimientos en el juego online.
En una sala de 2XKO, cuando un jugador se acerca lo suficiente a una cabina donde se está disputando una partida, aparece una ventana encima de su cabeza que muestra el estado actual de dicha partida. Puede que estén en la selección de campeón, que justo acaben de empezar la partida o en la última ronda y a un solo golpe de decidir el resultado. Sea cual sea, podéis ver lo que están viendo esos jugadores casi en tiempo real y sin sincronizaciones eternas o retardos de repeticiones. Así, podéis meteros de lleno en la acción como si hubieses estado ahí desde el principio.
Cómo funciona el Modo espectador en un servidor
Tuvimos que experimentar lo suyo para lograr que este sistema de espectador funcionara como queríamos. Los juegos de lucha que emplean rollback, como 2XKO, son totalmente deterministas, por lo que siempre se puede repetir el estado de la partida utilizando solamente los comandos. Así pues, si alguien se acerca a una cabina y empieza a observar la partida desde la primera ronda, le suministramos los comandos en orden y todo va como la seda. Pero ¿qué pasa si alguien se une en mitad de una partida? Una de las opciones es suministrar todos los comandos a los espectadores y hacer que avancen rápidamente hasta alcanzar el estado actual de la partida, pero eso lleva mucho tiempo. Las versiones tempranas de las salas de 2XKO antes de Alpha Lab 1 usaban este sistema. Funcionaba, pero era un poco chapucero. Tener que esperar entre 5 y 20 segundos para poder ver la partida en directo hizo que mucha gente ni se molestara en usar esta función.
Sin embargo, una vez implementamos el GVS, tuvimos las puertas abiertas para implementar algo mejor. Recordad que el GVS es el sistema que valida el estado del juego en tiempo real en el servidor. Si un jugador se pone a ver una partida ya empezada, no mandamos todos los comandos. En su lugar, se solicita al GVS una instantánea de la partida en ese momento exacto y comenzamos a mandar comandos a partir de ahí. Una instantánea es un guardado eficiente en memoria que incluye solo las partes deterministas del sistema. Pesa unos 50 KB, por lo que los jugadores lo reciben enseguida. En vez de tener que pasar tres minutos avanzando por los comandos, cargamos el guardado de 50 KB y el jugador pasa al punto actual de la partida al instante. Como por arte de magia.
Sin una simulación de la partida en el servidor, nos hubiera sido imposible desarrollar esta característica. En las versiones tempranas del Modo espectador, tomábamos la instantánea del primer jugador de la partida y se la enviábamos al espectador, pero eso causaba problemas de todo tipo. El primero: hacer la instantánea y comprimirla es un proceso bastante exigente. En equipos de gama baja, esto provocaba que el jugador sufriera un pequeño tirón de FPS cada vez que alguien se unía a la partida como espectador. Obviamente, que sucediera eso era inaceptable. Imaginad fallar un golpe solo porque un espectador se ha unido a la partida en el momento inoportuno. Y no solo eso: es muy inseguro. No queríamos poner en bandeja una vía de ataque a la gente con malas intenciones, puesto que podrían confeccionar una instantánea que contuviese algún tipo de ataque de desbordamiento del búfer u otra cosa que pusiera en riesgo el equipo de otros jugadores. Todos estos problemas se evitan trasladando la fuente de datos de los espectadores completa a una fuente de confianza en el servidor.
Emparejamiento entre salas
Lo último de lo que os quería hablar es la característica de emparejamiento entre salas. Las salas de 2XKO disponen de muchas formas de encontrar una partida: podéis desafiar directamente a un jugador, sentaros en una cabina y esperar a que alguien se siente junto a vosotros, poner vuestra monedita en la máquina para pediros el siguiente turno como en las recreativas de antaño o pedirle al sistema de emparejamiento que os encuentre un rival.
Esto funciona de maravilla cuando la sala está llena, pero en otros casos no tanto. ¿Qué pasa si todos los jugadores de la sala se lo están pasando en grande y no hay nadie más buscando partida?
Las salas en Alpha Lab 1 presentaban un montón de cosas buenas, como los marcadores, las rachas de victorias y el Modo espectador de fácil acceso, pero, a cambio, muchas veces resultaba difícil encontrar partida, como sucede en el caso que hemos puesto de ejemplo. De hecho, en el caso de aquellos jugadores que solo querían encontrar una partida online lo antes posible, la opción "Buscar partida" del menú principal les hubiese ayudado a encontrar una mucho más rápido por el simple hecho de que hubiese tenido en cuenta a todos los jugadores, no solo a los que había en la sala.
En la beta cerrada, modificamos el sistema de emparejamiento para que buscase partida en todas las salas online, no solo en la que os encontrabais. Si encuentra una partida en la sala en la que os encontráis, reservamos una plaza en una cabina de la sala y mandamos a los jugadores ahí para que jueguen. Si encuentra una partida con un jugador que está en otra sala, más o menos ocurre lo mismo. Cada jugador tendrá un puesto reservado en la cabina de su propia sala para poder jugar, y su oponente se sentará a su lado en forma de holograma. Cuando la partida acaba, ambos jugadores vuelven a sus salas originales. No os preocupéis; esto no afecta de ningún modo a vuestra racha de victorias.
Dado que todos los jugadores de todas las salas utilizan el mismo sistema de emparejamiento entre salas, se debería tardar lo mismo en encontrar una partida dentro de la sala que en encontrar una desde el menú principal con un sistema sin salas. El sistema buscara el mejor emparejamiento posible dentro de un periodo de tiempo establecido. Si es hora punta y hay mucha gente jugando, seguramente encontraréis una partida a los pocos segundos de empezar el emparejamiento. Si son las tantas de la noche y hay poquita gente jugando, y por ende poca gente con la que emparejaros, el sistema intentará encontrar a un rival lo más rápido posible, pero puede que haya una diferencia de nivel mayor de la que se produciría en hora punta. Ese emparejamiento más lento durante las horas de menor actividad no es algo exclusivo de 2XKO; así funciona el emparejamiento en cualquier juego online cuando hay menos jugadores disponibles. Cuánto priorizamos el tiempo en encontrar partida respecto a la diferencia de habilidad es algo que podemos ir ajustando, así que hacednos llegar vuestras opiniones. Queremos ir calibrándolo a lo largo del acceso anticipado para alcanzar ese equilibrio ideal.
De cara al futuro
Este artículo venía cargadito, así que si habéis llegado hasta aquí, os felicito. Creemos firmemente que las partidas online siempre deben ser la forma principal de disfrutar de un juego de lucha. Todas las características que hemos desarrollado, desde la validación del servidor hasta el ajuste del rollback, el Modo espectador instantáneo y el emparejamiento entre salas, están diseñadas con el fin de hacer que el juego online sea tan justo, rápido y divertido como el juego offline. No obstante, seguimos ajustando, probando y prestando atención a vuestros comentarios de cara al acceso anticipado y lo que vendrá después. Decidnos qué os está pareciendo, y seguid mandándonos vuestros informes de errores y sugerencias.
Gracias por leernos,
Tony Cannon