Não aceite apenas uma resposta direta "sim ou não, porque eu disse isso" aqui, pois você pode estar se abrindo para ter que enfrentar um monte de problemas com o UDP que na verdade você não precisa enfrentar.
Nenhuma das outras respostas aqui afirma a maneira óbvia de provar isso.
Veja alguns fatos simples
- Um cabeçalho IP tem 20 bytes, independentemente do protocolo usado.
- Os cabeçalhos UDP têm 4 bytes
- Os cabeçalhos TCP são 20 bytes
Portanto, toda vez que você envia uma mensagem de 1 byte abaixo da linha, você realmente enviou 25 ou 41 bytes, dependendo do protocolo, assumindo que um cabeçalho IP também é necessário.
fontes:
Meu conselho
Leve a sua situação em que você precisa da interação do servidor cliente, estime o número de clientes e faça as contas com base nos dados que você realmente envia entre os 2.
Um exemplo
Digamos que eu envio 10 mensagens com 1 byte cada por atualização no meu jogo e estou atualizando em torno de 60 fps, por isso preciso enviar 60 * 10 = 600 bytes por segundo dos dados reais da mensagem + os cabeçalhos relevantes.
Agora, dependendo do jogo, eu poderia enviar tudo isso como uma única mensagem, para que minha sobrecarga da camada TCP tivesse apenas 40 bytes (efetivamente um custo de UDP de 20 bytes por segundo), não ter essa sobrecarga é um custo potencial de 600 bytes ( porque talvez seja necessário reenviar todo o fluxo de mensagens).
Se, no entanto, é de vital importância que todas as mensagens sejam enviadas por si próprias no instante em que estiverem prontas para serem enviadas, eu tenho 600 mensagens (também 600 bytes) + 40 * 600 = 24k de sobrecarga TCP ou ~ 14k de UDP por segundo 600 bytes de dados da mensagem.
Novamente, fazemos as perguntas: quão vitais são essas mensagens, com que frequência elas são e podem ser agrupadas de alguma forma para reduzir as despesas gerais?
Isso se baseia apenas em várias mensagens de byte único; normalmente, você faria algo muito diferente, mas sem saber que os dados brutos estão sendo difíceis de provar de qualquer maneira, se o TCP é mais adequado à sua situação do que o UDP.
Então, vai funcionar?
Bem, se você tem um fps típico e a posição é importante (para evitar trapaceiros ou decisões incorretas), você precisa saber que o fluxo da sua rede é realizável, mas 32 players cada transmitem esses 24k + bytes de mensagens para frente e para trás (então 768KB / s + mensagens) ... trata-se de uma linha de banda larga de 10mb / s apenas para cabeçalhos individuais, com base no envio de pelo menos 1 mensagem por quadro de cada cliente para todos os outros clientes através de um servidor.
Obviamente, você não codificará o servidor e o cliente para trabalhar dessa maneira e os tamanhos das mensagens provavelmente serão muito maiores e provavelmente um pouco menos frequentes que 1 byte por quadro na maioria das situações, por isso é difícil dizer sem ver o mundo real exemplo "estes são os dados que preciso enviar".
O meu caso
No meu caso, fiz uma ligação que é uma sobrecarga razoável, mas isso se baseia na maneira como construo meus fluxos de mensagens, para que não haja sobrecargas enormes em comparação com alguns designs.
O TCP funciona bem e eu tenho uma estrutura de servidor e cliente MMO escalonável, mas não preciso transmitir muitos dados em um quadro ou muitos pacotes pequenos, porque posso agrupar minhas chamadas.
para outros: o TCP simplesmente não funciona, e eles só podem usar o UDP, mas precisam aceitar que isso não lhes dará garantias sobre o que recebem (garantia de pedidos / chegada).
Outras considerações
Muitos mecanismos de jogos mal codificados lidam com tudo no segmento principal da CPU, de modo que a CPU geralmente recebe apenas uma quantidade muito pequena de tempo para lidar com o código de rede, uma implementação decente do servidor e do cliente seria inteiramente assíncrona e possivelmente pressionaria e puxe mensagens em lotes.
Existem algumas boas bibliotecas de rede por aí, mas, como visto aqui, muitas parecem ter uma opinião de que o UDP é "apenas melhor", bem como fator para suas próprias necessidades primeiro e que pode não ser o caso, e encontrar uma biblioteca que não fator nas coisas da maneira que você faz pode resultar em uma configuração de TCP mal codificada em comparação com a variante UDP na mesma lib (só estou dizendo que vi isso e testes de carga provaram isso).
Crie algo primeiro, uma base técnica dos dados que você deseja enviar e teste-os, depois faça as contas para escaloná-los; na pior das hipóteses, teste-os com a implantação em uma nuvem e faça com que 50 computadores executem um cliente de teste para ver se ele pode manipular seu limite de 32 jogadores por jogo (ou quaisquer limites que você possa ter).