viernes, 1 de febrero de 2008

COMO FUNCIONA EL JUEGO ONLINE

Advertencia:

Tema geek si no eres aficionado a la tecnología ni leeas esto, te aburrirás de seguro, esto es demasiado geek y puede que me taches de nerd pero no me importa, está interesante.

Esto lo saque de una entrevista con Chris Butcher, espero les guste.

HALO NETWORKING

Chris Butcher es uno de los 4 lideres en ingenieria en los estudios Bungie que es responsable de la supervisión de la creación del hit “Halo 2”. Visitamos a Chris dos veces y tuvimos un par de entrevistas, una en la cual habló de IA y otra en la cual nos comentó lo siguiente:

Una de las grandes diferencias entre “Halo 2” y “Halo 1” es que “Halo 2” se puede jugar sobre Xbox Live. Para lograr esto Bungie tuvo que recrear el modo de jugabilidad en red de Halo para que este pudiera jugar a través de la Internet. Esta responsabilidad recayó sobre Chris y a continuación habla mas a detalle del tema.

MANTENGANSE UNIDOS EN LINEA

“Halo 1” era un juego de red por que tu lo podías jugar sobre tu LAN (Local Area Network) con el modo System Link. Eso fue todo un éxito en su época. Lo que en realidad quisimos para “Halo 2” fue tomar eso y extender el modelo de red a todo Internet para que se pudiera jugar sobre Xbox Live.

El juego en red de “Halo 1” se refiere como un juego síncrono de red. Esto significa que todos los dispositivos que están dentro de una red tienen cierto número de aplicaciones y diferentes instancias de software corriendo al mismo tiempo y todos se comunican entre sí. En este caso el juego está en 4 xboxes. Estas máquinas (xbox) o diskositivos están corriendo la misma simulación de juego con los mismos imputs (llamese imputs a las entradas de cada jugados es decir cuando alguien dispara un arma ese es un imput para quién recibe el balaso) entonces producirá un mismo output (llamese output a la reacción del que recibe el balaso) en todos los dispositivos. Así que en vez de mandar la información a cada máquina – cada pieza de información a cerca de que es lo que está pasando en TODO el juego – lo que mandamos es, “todos los imputs que existen para el juego están sucediendo en este momento y es cuando cada consola ejecuta el output”

Ahora, nuestro juego corre a 30 ticks por Segundo, por que NTSC es de 60 hertz. Así que corremos un tick por cada dos pantallazas… y rendereamos un frame al mismo tiempo, así que nuestro frame rate son 30 frames por segundo. Cada vez que corremos el juego, la maquina muestra lo que todos los jugadores están haciendo en el momento. Como lo que están haciendo en sus controles, si estás brincando o si te estás subiendo a un vehiculo, girando hacia la derecha, izquirda, jalando el botón de disparo, etc.

Entonces se manda esa información a cerca de los inputs que hay en la simulación de juego a toooodas las otras máquinas. También recibe información de todos los jugadores que no se encuentran localmente, y eso también se ignifica que cada maquina al mismo tiempo tiene todos los inputs que necesita de absolutamente todos los jugadores. Así mismo todas las máquinas conocen ( cada jugador en acción) donde está en el mundo de ese juego y las consecuencias, y las consecuencias están establecidas en todas las máquinas… así que el estado del mundo de ese juego se mantiene constante en todas las máquinas.





LA NUEVA RED EN HALO 2
Con todo lo anterior en resumen es que el cliente manda al servidor sus acciones y el servidor lo manda al cliente así que tienes que hacer muchos viajes entre el cliente y el servidor, eso funciona bien el una LAN. La latencia o el lag es probable dos o tres milisegundos entre las cajas. Si usas XB Connect Software donde puedes tener una PC que crea un túnel virtual desde tu xbox sobre Internet, tu puedes hacer que funcione a través de gente en Internet. Pero el hecho es que como tu eres un cliente debes de esperar el viaje que haces al servidor para hacer lo que sea así que tendrás mucho lag por un tiempo. Eso es lo que queremos evitar en “Halo 2” y se logró con un modelo de red que es susceptible a eso.
Así que yéndonos al tema de “Halo 2”.. mas que mandar tus acciones de máquina en máquina, lo que tenemos que hacer es seguir teniendo un cliente y un servidor, pero mas que un cliente esperando al servidor que le diga exactamente que va a pasar, el cliente está prediciendo el mundo entero. Está simulando el mundo exactamente como está pensado que las cosas sucedan, así que estará en perfecta sincronia con el servidor. Las cosas que no conocerá el cliente serán otros inputs, como los otros jugadores en el juego.

Así que cuando tomas ese modelo puedes predecir perfectamente, así que puedes correr, saltar y subirte a elevadores, así que puedes predecir perfectamente bien lo que va a hacer el cliente. Donde viene la diferencia es cuando tu interactúas con otra persona en el mundo. El cliente predice que otro jugador se está moviendo a la derecha por que la última información del servidor lo dice, pero si se mueve a la derecha al mismo tiempo, pude haber una diferencia.

Así que esos son el tipo de artefactos del modelo de red. Es aquí cuando interactuas con una serie de inputs de origen de alguna otra máquina, veras cosas extrañas que no empatan por que lo que tu estas prediciendo está en tu máquina. Así que el modo en que resolvemos esto sigue siendo un modelo cliente/servidor pero el cliente manda al servidor no solo la información a cerca de los apretones de botón que estoy haciendo ahorita, si no a un nivel mas alto, esto es que estoy mandando información a cerca de donde estoy en el mundo y que estoy haciendo en este momento. Así que mas que decir que movi mi joy stick 23 grados, diría que estoy en un warthog, estoy aquí y estoy manejando a esta dirección.

También se mandan un monton de eventos al servidor diciendo creo que esto es lo que está pasando en mi mundo. Como creo que voy a lanzar una granada, creo que sniperee a ese sujeto, creo que le pegue en la choya. Entonces lo que pasa es que el servidor procesa estos mensajes de cada máquina (todas las versiones de los eventos). Y lo que esta pasando en el servidor también corre su simulación. La diferencia en el servidor es que el no predice, el es la autoridad. El es el responsable de todo lo que sucede en el juego.




POR EJEMPLO…

Si yo soy el cliente, y jalo el gatillo para lanzar una granada, yo en realidad cree la granada en el mundo, yo corro la animación, yo corro el sonido de la granada. Pero la creación de la granada (en terminos de cómo afecta el mundo) yo no estoy autorizada a crearla por que esa es una acción que requiere una autoridad. El servidor es la única máquina que puede crear un objeto destruido y otras cosas como dañar gente o premiar muertes y cosas como esas. Así que lo que pasa es que el cliente le manda una petición al servidor como “permiso para lanzar una granada aquí” y el servidor dirá, “está bien te creo por que mi conocimiento dice que tu estás en esta ubicación y que es consistente con mi versión de eventos.” Así que en esencia hay una interacción entre el cliente mandando su versión de eventos al servidor y el servidor está tratando de conciliar esa información y crear una versión autoritativa del mundo, entonces el manda esas autorizaciones a todos los jugadores.

Así que toda la secuencia de lanzar una Granada de manera lógica es:

Yo lanzo una granada, veo la animación, escucho el sonido y después unos milisegundos después el servidor empezará a mandar información para este nuevo objeto en el mundo que es la granada que esta siendo creada como resultado de mis acciones. Así que desde la perspectiva del usuario, tu ves esta granada aparecer en medio del aire así que este engaño y predicción ayuda a ganar tiempo para que se complete la interacción. Interacciones como bajar a alguien de un vehiculo se hacen con 5 o 6 mensajes diferentes del servidor. Tu estás en el vehiculo, tu empiezas la animación de bajarlo del vehiculo, el sale pateado del vehiculo, el está ahora en este lugar del mundo. Todas las interacciones entre esos eventos se mandan por mensajes separados del servidor.

TODO ESTÁ EN SU LUGAR

“La última pieza del puzzle es un cliente que estas intentando presentar como una vista consistente del mundo al jugador. Lo que el servidor está enviándote es tal vez tus cuatro actualizaciones en un segundopara este jugador que esta corriendo y disparando cerca de ti. Así que básicamente estás recibiendo 4 datos en un segundo, esto es. “Aquí es donde está el jugador, aquí es donde está mirando y esto es lo que está haciendo en el mundo.” Así que si solo tomas en cuenta lo que se está mandando, el cliente se vería lento, como con lag por que no es infamación que pueda ser completamente confiable y eso le toma tiempo al cliente predecir.
Así que tenemos código que manipula los objetos en el mundo predecible del cliente. Básicamente trata de hacer mas leve la apariencia de que es lo que le está pasando a los jugadores en el mundo. Por ejemplo, mas que solo mandar el jugador “el está aquí, el está aquí, el está aquí” el servidor envía, “el está aquí y esto es lo que está haciendo con las siguientes direcciónes.” Entonces el cliente puede usar esa informaión para predecir tal vez los próximos 300 milisegundos de cómo se va a ver antes de que el sujeto llegue ahí. Así que mas que ver a un tipo ir lento en pasos lo veo aquí y está corriendo aquí y está corriendo aquí.

Una vez que predeciste el comportamiento del sujeto básicamente estás prediciendo mucho antes lo cual genera que no tengamos tanto lag y no existan pausas en los movimientos del entorno.
El problema en esencia del Nuevo modelo es que los servidores tienen que generar este flujo de datos para los clientes. Y como lo hacen? Bueno la manera en que lo hacen son diferentes: Están los estados persistentes de ls objetos y los objetos que toman lugar en un punto del plano.

Imaginense el estado persistente de este jersey en la mesa (el jersey lo pone en x posición sobre la mesa) o está en esta posición (chris cambia el jersey de posición) así que para cada objeto en el mundo el servidor está rastreando información a cerca de que ha cambiado relacionado con este objeto y que máquina está mandando esta información.
Por ejemplo, si yo lanzo una granada ahí, y ahí hay muchos objetos en el suelo van a volar, esto eventualmente se reestablecerá en nuevos lugares. Estos objetos quedarán marcados. Su nueva posición necesita ser mandada a todo mundo por que su posición cambió.
Pero a los jugadores que están lejos de ahí no les importan esos objetos por que tal vez ellos están en una batalla en algún otro lado. Pero cuando ellos van a ese punto querrán ver a esos objetos en el mismo lugar. Así que eso significa que esos objetos son prioridad baja por que están lejos del jugador. Pero están marcados por que necesitan ser transmitidos eventualmente. Así que después de un tiempo la prioridad de estos objetos se irá elevando y elevando hasta que eventualmente hasta que pasen un umbral de tiempo y se borren.
En mexico existe un deficit de velocidad de conexión es por ello que entendiendo todos los anteriores puntos se puede deducir que si tenemos conexiónes malas todo lo que hace el servidor y transmite a los clientes puede generar un lag por la lentitud de transferencia de datos, el procesamiento no es el problema el problema es esperara a que los datos regresen a la consola.

En Halo 2 existen dos escenarios de error:

1.- cuando la diferencia es de milisegundos y solo vemos lag.
2.- cuando la diferencia es considerable y todos los jugadores se des sincronizan, como por ejemplo cuando estamos jugando y se sale el servidor, o como cuando el servidor tiene un déficit en su conexión.