2011-02-08 28 views
9

Veo que esta pregunta se ha formulado antes, pero el contexto en torno a las preguntas suele ser vago. Estoy buscando construir un juego multijugador en tiempo real para Android donde exista un estado global que deba compartirse entre todos los clientes. Por lo tanto, tengo una tendencia a creer que UDP podría no ser suficiente. TCP da confiabilidad pero con la sobrecarga inherente. Sin embargo, dado que esta es la primera vez que abordé un problema así, estoy buscando algún comentario de las experiencias de otras personas.Juego para Android UDP/TCP?

Por lo tanto, (generalmente) en el contexto de un juego multijugador en tiempo real en un teléfono inteligente android, ¿la sobrecarga asociada con TCP es lo suficientemente aceptable como para que la experiencia del usuario no se vea afectada de manera tan adversa? También vale la pena mencionar que la conexión TCP debería ser una conexión persistente. Además, ¿sería un mejor enfoque el UDP junto con algunos mecanismos confiables desarrollados a medida? Cualquier entrada realmente me ayudaría & sería muy apreciada.

muchas gracias de hecho

Respuesta

10

La mejor respuesta es probablemente "pruébalo y ve".

Soy de la opinión de que la sobrecarga de TCP no es tan importante para la mayoría de las aplicaciones. El tamaño del encabezado es del orden de 10 bytes más grande, y los mensajes de confirmación deben enviarse y recibirse para cada mensaje.

El verdadero asesino para un juego en tiempo real va a ser la latencia. UDP es fuego y olvidar. Eso significa que cada mensaje simplemente está retrasado por el tiempo de tránsito entre los dos nodos. Dado que TCP requiere una confirmación, un mensaje realmente no se considera "enviado" hasta que se oiga el otro lado.

En general, el problema entre ellos se reduce a la detección de errores. Si se pierde un mensaje en las redes internas de alguna manera, ¿cómo te gustaría que se maneje? Si cada mensaje es bastante vital, entonces, si usa UDP, terminará teniendo que implementar su propio protocolo similar al TCP en la parte superior. También podría usar TCP y dejar que el hardware de red lo ayude. Sin embargo, si los mensajes antiguos después del tiempo que demoran varios intentos (cada uno en la latencia de la red) van a ser basura de todos modos con las nuevas actualizaciones entrando, entonces TCP es una pérdida de ancho de banda para usted.

+0

Gracias por la respuesta. Si voy con TCP, ¿es posible crear una conexión TCP persistente? – Joeblackdev

+0

Depende de lo que quiere decir con "persistente". Si quieres decir que sobrevive un reinicio, entonces no. (De hecho, puede tomar un tiempo para que el otro lado suelte su conexión. En ese caso, es ** demasiado persistente **). Si quiere decir que dura tanto tiempo como se ejecutan ambas aplicaciones, así es exactamente como funciona TCP. UDP, por supuesto, no tiene conexión. –

+0

TCP es totalmente bidireccional siempre que la sesión permanezca conectada. –

7

Esto no es realmente una pregunta de Android, aunque el protocolo y otros mecanismos que elija tendrán un efecto en el dispositivo (por ejemplo, la duración de la batería).

Qué protocolo elegir depende principalmente de sus requisitos (tamaño promedio de paquete, paquetes por segundo en promedio, si los paquetes perdidos son un problema, la cantidad de datos que enviará a la vez, es un problema de jitter, etc.). Sin embargo, puedo dar algunos consejos.

Aquí es un artículo muy bueno sobre la aplicación de redes Quake3:

http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/Quake3Networking

simple pero eficaz, que me gusta mucho y sólo puedo recomendar este hotel.

Aquí también un buen hilo sobre el tema:

http://www.gamedev.net/topic/319003-mmorpg-and-the-ol-udp-vs-tcp/

Algunos juegos utilizan UDP (especialmente FPS y RTS tipos), algunos de TCP, y algunos de ellos una cierta combinación de ellos (por ejemplo, UDP enviar datos del juego, TCP para chat y otras cosas). Cualquiera de los dos puede trabajar. También debe tener en cuenta que a los usuarios les puede gustar trabajar en redes 2G, 3G o WiFi, e incluso las redes WiFi pueden estar desfasadas y por exceso de capacidad. Sugeriría implementar un prototipo rápido y probarlo en varios entornos de red.

+0

Gracias por los enlaces mate. Le daré un vistazo. Por cierto, vamos a trabajar con 3G. – Joeblackdev

+3

Una cosa más: TCP realmente no estaba destinado a redes inalámbricas. Para la mayoría de las implementaciones de TCP, cuando se pierde un paquete (que es muy común en las redes inalámbricas), la pila generalmente piensa que es debido a la congestión en la ruta de la red, por lo que se retractará en el envío de paquetes. UDP y, por otro lado, no tiene este problema, pero no le da garantías sobre la entrega de paquetes. Compensaciones :-) – ldx

+0

Excelente, gracias por la entrada! Saludos – Joeblackdev

4

Estoy enfrentando el mismo problema. A partir de la revisión de la literatura he estado haciendo le sugiero que lea este artículo:

"Experiencias de implementación de un móvil multijugador en tiempo real de juego para redes inalámbricas con alta latencia" - http://www.hindawi.com/journals/ijcgt/2009/530367/

+0

Ese es un gran artículo. ¡Gracias por eso! – Joeblackdev

3

Puedes ver mi juego (aún en desarrollo): https://market.android.com/details?id=com.reality.weapons.ak47

Usa TCP/IP. Puede conocer las latencias disparando y observando los mensajes de notificación en "Battle log".

Hasta ahora estoy bastante satisfecho. En las zonas urbanas con buena cobertura GSM, de ida y vuelta

"fuego> viajes a Servidor> cálculo de Resultados> viajes consecuencia Back> mostrar notfication"

por lo general tarda menos de 200 Sra.

A veces podría ser 2 sec. Pero en el 99% es menos que 500 ms.

Cuestiones relacionadas