Atualmente, estou trabalhando em um jogo multiplayer on-line em tempo real. O objetivo é ter uma conexão baseada em cliente / servidor usando o protocolo UDP. Até agora, usei o UDP para os movimentos dos jogadores e o TCP para eventos (um disparo de jogador, um jogador que perde a vida) porque preciso garantir que esses dados cheguem a todos os jogadores conectados ao servidor. Eu sei que o UDP é considerado 'não confiável' e alguns pacotes podem ser perdidos. Mas eu li em todos os lugares para nunca misturar TCP e UDP, pois isso pode afetar a conexão.
A principal questão é como devo organizar minha rede?
UDP é sem conexão, como devo salvar quem é quem? Devo salvar os endereços IP dos clientes em uma lista?
Devo usar o TCP para eventos importantes ou usar o UDP? Se eu precisar usar o UDP, como posso garantir que os dados não serão perdidos?
Usando TCP e UDP, preciso salvar para cada jogador o IP em uma lista (para UDP) e o TcpClient que está conectado em outra lista (para o UDP). Como eu poderia mudar isso para ser mais eficaz?
fonte
Respostas:
O UDP tem menos sobrecarga, mas com o custo de perder pacotes sem saber (parte da sobrecarga com o TCP garante que os pacotes perdidos sejam reenviados).
No entanto, o grande problema do uso do UDP é que existem muitos sites que bloqueiam todo o tráfego UDP (exceto o DNS) porque muitos administradores acreditam que é uma boa prática de segurança.
Além disso, não assuma que todos os seus jogadores terão um endereço IP diferente - há muitas situações em que vários usuários compartilham a mesma conexão com a Internet e, se os alunos se viciam no jogo, pode apostar que provavelmente vai descobrir como instalá-lo e executá-lo durante a aula, em vez de fazer o trabalho deles (e você não prefere que eles gastem esse tempo precioso no seu jogo, em vez de no de outra pessoa?).
Uma vez que seu fluxo TCP está aberto, ele ainda é bastante eficiente. O próximo passo é minimizar a quantidade de dados que você está enviando / recebendo, e é aí que o design do protocolo entra em cena. Se você apenas enviar alguns bytes para cada comando (por exemplo, "avançar") em vez de, por exemplo, agrupar o mesmo comando em centenas de bytes de código XML, o consumo geral de largura de banda da rede será menor E menos ciclos de CPU serão ser necessário para processar as informações (alguns bytes são facilmente comparados com a desmontagem, interpretação e verificação de sintaxe de uma grande parte do XML).
Você certamente pode abrir vários fluxos TCP e usá-los para diferentes propósitos, como um para comandos, outro para transferências de gráficos, outro para bate-papo baseado em áudio, etc. Dessa forma, se você estiver transferindo um gráfico grande que requer 5-10 segundos para fazer o download, pelo menos os movimentos de comando do jogador não ficarão atrasados porque estarão em um fluxo diferente (e você poderá exibir um sprite padrão até que o novo sprite termine o download, o que é sempre mais divertido do que esperar).
fonte
Esta não é uma resposta direta à sua pergunta, mas o gafferongames possui alguns artigos muito bons sobre jogos em rede: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -game-networking /
fonte