EsHowto >> Electrónica >> Juegos y equipo

Halo Networking:una entrevista con Chris Butcher

Halo Networking:una entrevista con Chris Butcher

Chris Butcher es uno de los cuatro jefes de ingeniería en Bungie Studios, quienes fueron responsables de supervisar la creación del gran éxito "Halo 2". Si has leído nuestro artículo sobre la A.I. de Halo 2, entonces ya sabes que Chris es un tipo muy inteligente. Cuando visité Bungie el 3 de noviembre, tuve la oportunidad de sentarme con Chris dos veces.

Una de las mayores diferencias entre "Halo 2" y el "Halo" original es que "Halo 2" se puede jugar en Xbox Live. Para lograrlo, Bungie tuvo que crear una nueva forma de interconectar las partidas multijugador de Halo a través de Internet. Esta responsabilidad recayó en gran medida sobre los hombros de Chris. En mi segunda entrevista hablamos sobre la creación de redes "Halo 2".

Halo Networking:una entrevista con Chris Butcher Bungie lleva el multijugador de "Halo 2" al mundo.

Ahora, en lugar de poner este artículo en la forma tradicional de preguntas y respuestas que está acostumbrado a ver, solo voy a dejar que lea lo que Chris dijo. Porque la verdad es que solo le hice una pregunta a Chris:

"Entonces, ¿qué se tuvo que hacer para poner 'Halo 2' en vivo?"

Sigue leyendo para conocer su respuesta.

Contenido
  1. Manténganse juntos ahora
  2. ¿Quién está a cargo aquí?
  3. Una nueva red para Halo 2
  4. Por ejemplo
  5. Todo en su lugar correcto
  6. Teniendo en cuenta tus prioridades

Permanecer juntos ahora

Halo Networking:una entrevista con Chris Butcher "Halo 1 es lo que se conoce como red síncrona".

Chris Carnicero :

"Halo 1 era un juego en red porque podías jugarlo a través de la LAN (Red de área local) con System Link. Esa fue una parte muy exitosa. Lo que realmente queríamos hacer para 'Halo 2' era tomar eso y extender el modelo de red a Internet para que pudieras jugar en Xbox Live.

La red 'Halo 1' es lo que se conoce como red síncrona . Lo que eso significa es que si tiene una cierta cantidad de aplicaciones y diferentes instancias de software que se ejecutan en diferentes máquinas. En este caso, el juego está en cuatro Xboxes. Todas esas máquinas ejecutan la misma simulación de juego y la simulación de juego es determinista. Eso significa que si proporciona a la simulación las mismas entradas, producirá las mismas salidas cuando ejecute todo ese código. Usamos ese hecho para aprovechar el juego multijugador. En lugar de enviar [la información] a cada máquina, cada pieza de información sobre lo que sucede en todo el mundo del juego, lo que enviamos es, "aquí están las entradas que proporcionamos para la simulación del juego en este instante. "

Ahora nuestro juego funciona a 30 tics por segundo, porque NTSC es de 60 hercios. Así que ejecutamos un tick de juego por cada dos sorteos de la pantalla... y renderizamos un cuadro a la vez, por lo que nuestra velocidad de cuadros es de 30 cuadros por segundo. Cada vez que ejecutamos el juego, la máquina muestra lo que los jugadores están haciendo en el juego en ese momento. Por ejemplo, lo que están haciendo en sus controladores, ya sea que estén saltando o tomando vehículos, girando tres grados a la izquierda, apretando el botón de disparo... o cosas por el estilo.

Luego envía esa información sobre las entradas de los jugadores en la simulación del juego a todas las demás máquinas. También recibe información de todos los jugadores que no están en la máquina local, lo que significa que cada máquina al mismo tiempo tiene todas las entradas que necesita y todas ejecutan la simulación juntas... Entonces todas las máquinas saben dónde [la acción de cada jugador] está en el mundo y las consecuencias, y las consecuencias se promulgan en todas las máquinas... Por lo tanto, el estado del mundo se mantiene consistentemente en todas las máquinas".

¿Quién está a cargo aquí?

Halo Networking:una entrevista con Chris Butcher "La cosa con este modelo de red es si hay un error en el código de la computadora donde dos máquinas podrían proporcione las mismas entradas pero obtenga diferentes salidas, puede haber problemas".

Chris Butcher continúa :

"Halo también es un modelo de red basado en cliente/servidor, lo que significa que una máquina en el juego es el servidor del juego, y luego todos se unen, lo que convierte a esa máquina en el maestro. Si eres un cliente, envías tus acciones al servidor. y luego, cuando el servidor recibe las acciones de todos, envía las acciones colectivas de todos a todos los clientes. Y así es como nos aseguramos de que todos estén juntos en el mismo juego.

En realidad, es el mismo modelo de red que usamos en Marathon en el pasado, aunque Marathon tenía algunos errores. Lo que pasa con este modelo de red es que si hay un error en el código de la computadora donde dos máquinas pueden proporcionar las mismas entradas pero obtener diferentes salidas, puede haber problemas. Hay un montón de maneras diferentes que podría suceder. Podría ser un error en el que está utilizando solo un poco de memoria basura aleatoria en la computadora y eso sería aleatorio de una máquina a otra. Eso sería malo.

La otra cosa es que no estamos ejecutando exactamente la misma simulación en todas las máquinas. Cuando [el servidor] está enviando información sobre qué acciones están ocurriendo en todas las máquinas [no] las envía a todos. Sería un modelo de iguales puro si lo enviáramos a todos.

La cuestión es que ejecutamos la simulación y el mundo, eso es una parte de lo que hacemos, pero luego en cada cuadro también tenemos que hacer cosas solo para el jugador local, como que tienes que averiguar cuál es su arma en primera persona. haciendo, ya sea que estén recargando o lanzando una granada. De hecho, también representamos su visión del mundo.

Entonces, esas acciones, porque solo tienen lugar en una máquina, no se puede permitir que esas acciones afecten el estado determinista del mundo. Así que básicamente tenemos una separación dentro de nuestro juego. Esto es lo que es determinista:son todos los objetos del mundo y cómo se mueven. Estas son las cosas que no son deterministas:los sonidos que puede escuchar en la máquina local, lo que está renderizando con sus gráficos y un par de cosas más. Tenemos que separar a esos dos.

Si los mantenemos separados, el juego permanecerá sincronizado entre las otras máquinas. Pero si no están separadas correctamente, si hay información transferida entre las dos, entonces las máquinas divergirán en la simulación, y es posible que no lo note necesariamente porque una máquina podría ser como el jugador aquí, pero el mismo jugador es [en un lugar ligeramente diferente] en la máquina de otra persona, por lo que es posible que no lo notes necesariamente, a menos que intentes dispararles y la bala los golpee de tal manera que los golpeó en una máquina y no los alcanzó en otra máquina. Luego, la divergencia básicamente cae en cascada hasta que finalmente el juego es completamente diferente en diferentes máquinas y entonces, por supuesto, no tiene sentido".

Una nueva red para Halo 2

Chris Butcher continúa :

"Entonces, lo importante de eso es que, debido a que el cliente envía al servidor sus acciones y el servidor las devuelve al cliente, debe haber un viaje de ida y vuelta entre el cliente y el servidor. Eso funciona bien en las redes de área local. La latencia es probablemente dos o tres milisegundos entre casillas. Ya sabes, si usas el XB Connect Software donde puede tener una PC que canaliza el tráfico desde su Xbox a través de Internet, puede hacer que funcione entre personas a través de Internet. Pero nuestra experiencia es que debido a que usted es un cliente, tiene que esperar el viaje de ida y vuelta desde su servidor para que su acción haga algo. Todo su movimiento o sus disparos se retrasan en cierta medida. Lo que queremos evitar con 'Halo 2' es diseñar un modelo de red que sea realmente susceptible a eso.

Entonces, pasar a 'Halo 2'... en lugar de enviar sus acciones de una máquina a otra, lo que tenemos que hacer es que todavía tenemos un cliente y un servidor, pero en lugar de que el cliente espere que el servidor le diga exactamente lo que debe suceder. con un giro, el cliente está prediciendo el mundo entero. Está simulando el mundo exactamente como cree que deberían suceder las cosas, por lo que estará perfectamente sincronizado con el servidor. Las cosas que el cliente no conoce son otras fuentes de información, como los demás jugadores del juego.

Entonces, cuando tomas ese modelo, puedes predecirte a ti mismo perfectamente, para que puedas correr, saltar, subirte a los ascensores y todas esas cosas, puedes predecir qué está haciendo bien el jugador en el cuadro del cliente. Donde entran las diferencias es cuando interactúas con otras personas en el mundo. El cliente predice que el otro jugador se está moviendo hacia la izquierda porque la última información del servidor así lo indica, pero si se movió hacia la derecha en este momento, podría haber una ligera diferencia.

Estos son el tipo de artefactos del modelo de red. Es que cuando interactúas con una fuente de entrada colectiva de alguna otra máquina, verás una extrañeza que no coincide con el mundo que predijiste en tu máquina. Entonces, la forma en que hacemos eso es que todavía necesitamos un servidor/modelo de cliente, pero el cliente envía al servidor no solo información sobre estos son los botones que estoy presionando, sino que está en un nivel superior, es información sobre dónde estoy en el mundo y lo que estoy haciendo en ese momento. Entonces, en lugar de decir que ajusto la fuerza de mi joystick 23 grados, simplemente diría que estoy en el Warthog, estoy aquí y conduzco en esta dirección.

También envía una secuencia de eventos al servidor diciendo que esto es lo que creo que está sucediendo en mi mundo. Como si pensara que estoy lanzando una granada, creo que le disparé a ese tipo, creo que lo golpeé en la cabeza. Luego, lo que sucede es que el servidor procesa estos flujos de cada máquina:son todas sus versiones de eventos. Y lo que sucede es que el servidor también ejecuta su propia simulación. La diferencia es que no se predice; es la autoridad. Es responsable de todas las cosas que suceden en el juego".

Por ejemplo

Halo Networking:una entrevista con Chris Butcher "El servidor es la única máquina que puede crear un objeto destructor y hacer otras cosas como dañar personas o muertes por premios y cosas por el estilo".

Chris Butcher continúa :

"Entonces, si soy el cliente y aprieto el gatillo para lanzar una granada, en realidad creo la granada en el mundo. Reproduciré la animación, reproduciré el sonido. Pero la granada [en términos de realidad afectando al mundo] - No tengo permitido crear eso porque es una acción que requiere la autoridad para hacerlo. El servidor es la única máquina que puede crear un objeto destructor y hacer otras cosas como dañar a las personas u otorgar asesinatos y esas cosas. así. Entonces, lo que sucede es que los clientes están enviando solicitudes al servidor como, 'Solicito arrojar una granada aquí'. El servidor dirá:'Está bien, te creo porque mi conocimiento dice que estás aquí en este lugar y eso es consistente con mi versión de los hechos'. Esencialmente, existe una interacción entre el cliente que envía su versión de los eventos al servidor y el servidor que intenta reconciliarlos y crear la versión autorizada del mundo. Luego envía la versión autorizada a todos en el mundo.

Entonces, la secuencia completa de eventos para lanzar una granada es:lanzo una granada, veo la animación, escucho el sonido y luego, una cantidad de milisegundos más tarde, el servidor comenzará a enviar la información para este nuevo objeto en el mundo que es el granada que creó como resultado de mis acciones. Entonces, desde la perspectiva del usuario, ves esta granada aparecer en el aire allí mismo y tenemos todos estos trucos y predicciones para que parezcan estas interacciones complejas. Las interacciones como abordar el vehículo de alguien se componen esencialmente de cinco o seis mensajes diferentes del servidor. Estás en el vehículo, inicias la animación para abordarlo, lo expulsan y está aquí en el mundo. Toda la interacción entre esos eventos se envía como un mensaje separado del servidor".

Todo en su lugar correcto

Halo Networking:una entrevista con Chris Butcher "Luego, el cliente puede usar esa información para predecir quizás durante los próximos 300 milisegundos lo que sucederá como antes de que el tipo llegue allí".

Chris Butcher continúa :

"La última pieza del rompecabezas es que, como cliente, intentas presentar una visión coherente del mundo al jugador. Lo que el servidor te envía es quizás cuatro actualizaciones por segundo para este jugador que se está ejecutando y disparando. cerca de ti. Así que básicamente cuatro veces por segundo obtienes:"Aquí es donde está ese jugador, aquí es donde está mirando y esto es lo que está haciendo en el mundo". enviado, el cliente vería una gran cantidad de comportamiento entrecortado y entrecortado porque no es necesariamente un paquete fluido que proviene del servidor.

Así que tenemos un código que administra los objetos en el mundo del cliente predicho. Básicamente, trata de suavizar la apariencia de lo que les sucede a los jugadores en el mundo. Por ejemplo, en lugar de simplemente enviar al jugador "Está aquí, está aquí, está aquí". el servidor envía:'Él está aquí y esto es lo que está haciendo y esta es la dirección en la que se dirige'. Luego, el cliente puede usar esa información para predecir, quizás durante los próximos 300 milisegundos, cómo se verá eso antes de que el tipo realmente llegue allí. Entonces, en lugar de ver a un tipo volverse idiota, idiota, idiota, idiota, lo veo aquí y está corriendo aquí y está corriendo aquí.

Una vez que has predicho el comportamiento del tipo, básicamente aplicas el suavizado para suavizar esas diferencias en la transmisión de datos para que veas al tipo corriendo. Tal vez el rango de su movimiento no sea completamente consistente, pero no lo sacudimos de un lugar a otro. Lo aceleramos o lo ralentizamos en función de dónde creemos que debe estar en ese momento. Y, por supuesto, haces lo mismo con los vehículos, los objetos físicos del mundo y todo eso.

Entonces, el problema esencialmente... es que los servidores tienen que generar este flujo de información de los clientes. ¿Y cómo hacen eso? Bueno, la forma en que lo hacemos es que hay dos tipos diferentes de cosas que el servidor puede enviar:está el estado de persistencia de los objetos y los eventos que tienen lugar.

Así que imagina el estado de persistencia de esta camiseta sobre la mesa, que está en esta posición [Chris mueve la camiseta] o está en esa posición, ¿verdad? Entonces, para cada objeto en el mundo, el servidor está rastreando información sobre lo que ha cambiado en este objeto y desde qué máquina se envía esta información.

Por ejemplo, si lanzo una granada aquí, y hay muchos objetos en el suelo en ese lugar y salen volando, eventualmente se asentarán en nuevos lugares. Esos objetos serán marcados. Su nueva posición debe enviarse a todo el mundo porque su posición ha cambiado.

Pero a las personas que están muy lejos no les importan mucho esos objetos porque tal vez estén en una batalla en alguna parte. Pero cuando lleguen a ese lugar, eventualmente querrán que esos objetos estén en el lugar correcto. Entonces, lo que eso significa es que esos objetos tienen baja prioridad porque están muy lejos. Pero están marcados porque necesitan ser transmitidos eventualmente. Entonces, con el tiempo, la prioridad de esos objetos aumentará y aumentará hasta que eventualmente superen el umbral para ser enviados".

Tener claras tus prioridades

Chris Butcher continúa :

"Básicamente, el sistema recuerda lo que envía a las personas. Sabe que tengo 5000 piezas de información que me gustaría que tuvieras, pero solo puedo enviarte quizás 50 en este paquete porque la red solo permite paquetes de cierto tamaño, transmite una cierta velocidad para no congestionar la red.

Por lo tanto, descubre que las cosas más importantes se basan en dónde se encuentra, qué está haciendo, si está vivo o muerto, si le está disparando a alguien. Sabes, si le estoy disparando a alguien y está frente a mí, necesito saber sobre ellos con una prioridad muy alta. Pero si hay alguien detrás de mí que no puedo ver, no necesito saber nada de ellos. El servidor determina la prioridad de los objetos. Hay muchas reglas para las cosas. Las granadas tienen una prioridad entre 50 y 70, pero solo un pequeño objeto en el suelo, tal vez no sea una prioridad, entre 10 y 20, ya sabes, o algo así. En realidad, hay casos en los que un objeto de baja prioridad no se representaría en absoluto desde el lado del cliente.

Básicamente, hay dos tipos de datos que se priorizan. Existe el estado de persistencia de los objetos que siempre se enviarán eventualmente. Pueden tardar mucho tiempo y el motivo es que si hay un objeto que se mueve continuamente con una prioridad baja, entonces no desea enviar información sobre ese objeto hasta que lo haya visto. Es posible que desee una actualización cada 10 segundos para decir con una prioridad baja:"Aquí es donde está". El sistema de prioridad gestiona la prioridad de los objetos, el tiempo transcurrido desde la última transmisión y cuánta información se necesita para transmitir esos datos.

Hay un estado persistente y también hay una corriente de eventos que están ocurriendo en el mundo, como una bala que golpeó una pared o un tipo que dijo "urg" porque lo mataron. Estos eventos son la información que no necesitamos enviar. Si es necesario eliminar eventos, lo haremos. Entonces, por ejemplo, si explotara un millón de granadas en una partida multijugador, muchas de esas granadas simplemente se caerían porque no podían entrar en la tubería lo suficientemente rápido. Se descartarían como irrelevantes. Así que existe este equilibrio entre las cosas que tienes que tener y las cosas que están pasando en el mundo que te dan una mejor imagen, pero que no son necesarias.

Esta separación de datos significa que podemos admitir todo tipo de cosas interesantes. Por ejemplo, debido a que a cada cliente se le envía el estado persistente de las entidades en el mundo (las entidades son lo que llamamos los objetos persistentes en el mundo), eso significa que cualquier cliente tiene toda la información sobre el mundo. Debido a que el cliente sabe todo sobre el mundo, podemos ayudarlo a convertirse en un nuevo servidor, si la máquina del servidor se apagara, se desconectara de Xbox Live o el jugador simplemente quisiera abandonar el juego. Lo que sucede es que el juego se detiene, se determina un nuevo servidor, se cambia el control y el juego continúa. También funciona en un juego LAN. Así que puedes terminar un juego con un conjunto de jugadores completamente diferente al que tenías cuando comenzaste, porque tenemos la tecnología para replicar esa información y reasignar un nuevo servidor.

El potencial de Xbox Live podría ser realmente emocionante. Hay todo tipo de ramificaciones sociales interesantes para llevar este juego en línea. Hay mucho más que lo que hemos hablado. No soy la mejor persona para hablar sobre todos los aspectos sociales del diseño de una interfaz de usuario o dirigir a los jugadores a los juegos, pero definitivamente puedo hablar sobre el lado de la red".

Ciertamente puedes Chris, ciertamente puedes.