¿Cómo funciona Spaceteam?

Para aquellos que no conocen, Spaceteam es un juego multijugador muy popular y muy divertido para iOS.

Permite un juego en time real entre múltiples dispositivos en una networking Wi-Fi ad-hoc, ¿cómo hace esto?

¿Existen bibliotecas publicadas que describan cómo crear protocolos además de las bibliotecas de networkinges ad-hoc? ¿Es específico de iOS, o sería posible build una variedad de aplicaciones en diferentes plataforms?

¡Rápidamente, responde antes de que lleguemos al asteroide!

Específicamente, ¿en qué aspecto estás interesado? No hay nada particularmente especial en dispositivos mobilees o networkinges Wi-Fi ad hoc (excepto en una networking ad hoc , no todos los dispositivos pueden comunicarse entre ellos, por lo que algunas networkinges de malla pueden ayudar pero complica innecesariamente las cosas para el caso normal).

Primero responderé la pregunta más amplia, porque es más interesante. En mi experiencia, hay un puñado de consideraciones importantes:

  • Servidor / cliente o peer-to-peer? Con esto quiero decir si hay un "maestro" que decida el verdadero estado del mundo y lo comunique a todos los clientes. Avara es el único juego que conozco que es "peer-to-peer" en este sentido (los compañeros enviaron commands a todos los demás compañeros, lo que resultó ser muy pesado para los usuarios de módem en los juegos de 6 jugadores). No conozco juegos que utilicen topologías de networking más sofisticadas para comunicar el estado del juego (p. Ej., Solo enviar datos a un cliente en cada LAN).
  • ¿Qué haces sobre la latencia? Avara es el único juego que conozco, que se queda a nivel local por la "tolerancia a la latencia" para get un estado coherente del mundo, lo que fue terrible si alguien estaba usando un módem (desactivar la compression me ayudó mucho). Hay varias maneras de hacer "compensación de latencia" (por ejemplo, en Half-Life / CS), algunas de las cuales también podrían funcionar en juegos de igual a igual.
  • Sincronización de time? Para los juegos cliente-server, al less necesita preocuparse por un RTT cambiante. Para los juegos peer-to-peer, creo que también desea acordar el time que minimiza la latencia máxima efectiva.
  • ¿Qué pasa si los clientes no están de acuerdo con el estado del mundo? Avara solo permite que los compañeros decidan sobre su propio estado del mundo (y muestra "fragmentación de la realidad detectada" si detecta un desajuste, lo que podría suceder debido a packages caídos o una "tolerancia de latencia" demasiado baja).
  • ¿Qué pasa si un jugador se va? Para un juego P2P, es posible que tengas que aceptar un estado de juego consistente (por ejemplo, si el jugador se desconectó después de enviar commands a un subset de otros compañeros). Para un juego cliente-server, es posible que deba elegir un nuevo maestro.

Y ahora, después de ver el trailer de Spaceteam:

No tengo idea de cómo funciona, ya que no he diseñado ingeniería inversa del protocolo. Sin embargo, es bastante simple hacer algo que funcione bastante bien :

  • Usa algún tipo de descubrimiento P2P para encontrar jugadores (p. Ej., Bonjour; debería haber muchos documentos y muestras por ahí).
  • Comunicarse con sus compañeros. Lo he hecho con GameKit alnetworkingedor de iOS 3/4 (no estoy seguro de si todavía funciona a través de Wi-Fi).
  • Elige un maestro Esto puede ser tan simple como quien presiona los últimos bashs de "listo" para ser el maestro . En algunos casos extremos, es posible que tenga que manejar el error.
  • Deja que el maestro decida todo. Spaceteam no es sensible a la latencia; La latencia de wifi tiende a ser como mucho un puñado de milisegundos, y nadie realmente va a notar si un dispositivo es más lento en 100 ms (siempre que la interfaz de usuario responda lo suficientemente rápido).