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?
fuente
Respuestas:
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).
fuente
Esta no es una respuesta directa a su pregunta, pero gafferongames tiene algunos artículos realmente buenos sobre juegos de red: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -game-networking /
fuente