Noções básicas de jogos multiplayer online [fechado]

9

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?

Lowip
fonte
@ JoshPetrie esta pergunta é legítima "A questão principal é como devo organizar minha rede?". Não se trata de usar isso ou aquilo. O OP usa um e precisa de conselhos sobre como adicionar outra tecnologia que ele já escolheu. É amplo, pois a resposta não reside em qual tecnologia deve ser usada, mas em como o software pode ser estruturado para evitar inchaços nos canos, reduzir o atraso e aumentar a confiabilidade independentemente da tecnologia subjacente.
Coyote
Também é muito amplo. A pergunta deve ser editada (sinta-se à vontade para fazê-lo, é bastante antiga) para ter mais tópicos e, em seguida, pode ser reaberta.

Respostas:

6

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).

Randolf Richardson
fonte
11
A pergunta original mencionava um modelo cliente-servidor; portanto, "sites" que bloqueiam todos os UDP são irrelevantes; esse é o problema do cliente, e duvido que muitos deles realmente bloqueiem todo o UDP. "Usar o TCP é o pior erro possível que você pode cometer ao desenvolver um jogo em rede! Para entender por que, você precisa ver o que o TCP está realmente fazendo acima do IP para fazer tudo parecer tão simples!" Veja gafferongames.com/networking-for-game-programmers/udp-vs-tcp
verdade005
@ Indeed005: Existem prós e contras nisso - o UDP definitivamente oferece uma vantagem de desempenho, mas com o custo de confiabilidade (que é onde o TCP tem a vantagem). Quanto ao bloqueio do UDP, você está absolutamente certo sobre o problema do cliente, mas em muitos ambientes corporativos e educacionais encontrei o UDP (exceto a porta 53) bloqueado por administradores sem noção que acham que o UDP é um problema de segurança e portanto, a opção para o cliente fazer o fallback para o TCP pode pelo menos significar que o jogador pode experimentar o jogo (especialmente se a largura de banda da rede for rápida o suficiente).
Randolf Richardson
@ De fato005: Além disso, o uso de uma mistura de UDP e TCP também pode ser bastante aceitável, pois o TCP pode ser usado para transferências de dados de baixa prioridade, enquanto o UDP pode ser usado para o lado de ação de alta velocidade. Interessante notar também é que, com o IPv6, há novas opções disponíveis (que não estão disponíveis com o IPv4) que podem atender às necessidades em tempo real dos jogos, embora não sejam de natureza sem conexão, mas acho que levará um tempo até o IPv6 pode ser utilizado por jogos sem ter que confiar no IPv4 (isso é lamentável, por isso nos contentamos com o IPv4 da melhor maneira possível por enquanto).
Randolf Richardson