Conceptos básicos del juego multijugador en línea [cerrado]

9

Actualmente estoy trabajando en un juego multijugador en línea ac # en tiempo real. El objetivo es tener una conexión cliente / servidor utilizando el protocolo UDP. Hasta ahora he usado UDP para los movimientos de los jugadores y TCP para eventos (un jugador disparando, un jugador que pierde la vida) porque necesito asegurarme de que tales datos lleguen a todos los jugadores conectados al servidor. Sé que UDP se dice 'poco confiable' y algunos paquetes pueden perderse. Pero he leído en todas partes para nunca mezclar TCP y UDP porque puede afectar la conexión.

La pregunta principal es ¿cómo debo organizar mi red?

UDP no tiene conexión, ¿cómo debo guardar quién es quién? ¿Debo guardar las direcciones IP de los clientes en una lista?

¿Debo usar TCP para eventos importantes o usar UDP? Si necesito usar UDP, ¿cómo puedo asegurarme de que no se perderán datos?

Al usar tanto TCP como UDP, necesito guardar para cada jugador su IP en una lista (para UDP) y el TcpClient que está conectado en otra lista (para UDP). ¿Cómo podría cambiar eso para que sea más efectivo?

Lowip
fuente
@JoshPetrie esta pregunta es legítima "La pregunta principal es ¿cómo debo organizar mi red?". No se trata de usar esto o aquello. El OP usa uno y necesita consejos sobre cómo agregar otra tecnología que ya eligió. Es amplio ya que la respuesta no reside en qué tecnología se debe usar, sino en cómo se puede estructurar el software para evitar hinchar las tuberías, reducir el retraso y aumentar la confiabilidad independientemente de la tecnología subyacente.
Coyote
También es demasiado amplio. La pregunta debe ser editada (siéntase libre de hacerlo, es bastante antigua) para estar más en el tema, luego se puede volver a abrir.

Respuestas:

6

UDP tiene menos sobrecarga, pero a costa de perder paquetes sin saberlo (parte de la sobrecarga con TCP asegura que los paquetes perdidos se vuelvan a enviar).

Sin embargo, el gran problema con el uso de UDP es que hay muchos sitios que bloquean todo el tráfico UDP (excepto DNS) porque muchos administradores creen que es una buena práctica de seguridad.

Además, no asuma que cada uno de sus jugadores tendrá una dirección IP diferente: hay muchas situaciones en las que varios usuarios comparten la misma conexión a Internet, y si los niños de la escuela se enganchan en su juego, puede apostar que probablemente va a descubrir cómo instalarlo y ejecutarlo durante la clase en lugar de hacer su trabajo (¿y no preferirías que pasen este precioso tiempo en tu juego en lugar de en el de otra persona?).

Una vez que su flujo TCP está abierto, sigue siendo bastante eficiente. El siguiente paso es minimizar la cantidad de datos que está enviando / recibiendo, y aquí es donde entra en juego el diseño del protocolo. Si solo envía unos pocos bytes para cada comando (por ejemplo, "avanzar") en lugar de, por ejemplo, envolver el mismo comando en cientos de bytes de código XML, el consumo general de ancho de banda de la red será menor Y se reducirán los ciclos de CPU sea ​​necesario para procesar la información (unos pocos bytes se comparan fácilmente en comparación con el desmantelamiento e interpretación y la verificación de sintaxis de una gran parte de XML).

Ciertamente puede abrir múltiples flujos TCP y usarlos para diferentes propósitos, como uno para comandos, otro para transferencias de gráficos, otro para chat basado en audio, etc. De esa manera, si está transfiriendo un gráfico grande que requiere 5-10 segundos para descargar, al menos los movimientos de comando del jugador no se retrasarán porque estarán en una secuencia diferente (y puede mostrar un sprite predeterminado hasta que el nuevo sprite termine de descargarse, que siempre es más divertido que esperar).

Randolf Richardson
fuente
1
La pregunta original mencionaba un modelo cliente-servidor, por lo que los "sitios" que bloquean todos los UDP son irrelevantes; ese es el problema del cliente, y dudo que muchos clientes realmente bloqueen todos los UDP. "¡Usar TCP es el peor error posible que puedes cometer cuando desarrollas un juego en red! ¡Para entender por qué, necesitas ver lo que TCP está haciendo realmente por encima de IP para que todo parezca tan simple!" Ver gafferongames.com/networking-for-game-programmers/udp-vs-tcp
Indeed005
@ Indeed005: Hay ventajas y desventajas en esto: UDP definitivamente proporciona una ventaja de rendimiento, pero a costa de la confiabilidad (que es donde TCP tiene la ventaja). En cuanto al bloqueo UDP, tiene toda la razón acerca de que es un problema del cliente, pero en muchos entornos corporativos y educativos he encontrado que UDP (excepto el puerto 53) está bloqueado por administradores desorientados que piensan que UDP es un problema de seguridad, y Por lo tanto, la opción de que el cliente recurra a TCP al menos puede significar que el jugador puede experimentar el juego (especialmente si el ancho de banda de la red es lo suficientemente rápido).
Randolf Richardson
@ Indeed005: Además, el uso de una mezcla de UDP y TCP también puede ser bastante aceptable, ya que TCP se puede usar para las transferencias de datos de menor prioridad, mientras que UDP se puede usar para el lado de acción de alta velocidad. Es interesante notar también que con IPv6 hay nuevas opciones disponibles (que no están disponibles con IPv4) que pueden satisfacer las necesidades en tiempo real de los juegos sin ser de naturaleza sin conexión, pero creo que pasará un tiempo antes de IPv6 los juegos pueden utilizarlo sin tener que depender también de IPv4 (esto es lamentable, por lo que nos las arreglamos con IPv4 lo mejor que podemos por ahora).
Randolf Richardson