Estamos criando um jogo multiplayer em tempo real, no qual cada jogador é responsável por relatar seu estado em todas as iterações do ciclo do jogo.
As atualizações de estado são transmitidas usando UDP não confiável .
Para minimizar o envio de dados de estado, criamos um sistema que enviará apenas deltas (quaisquer que sejam os dados de estado que foram alterados).
Este método, no entanto, é falho, pois um pacote perdido significa que outros jogadores não receberão o delta, fazendo com que o jogo se comporte de maneira inesperada.
Por exemplo:
Suponha que o estado seja composto por: {positionX, positionY, health}
Frame 1 - positionX changed --> send a packet with positionX only.
Frame 2 - health changed // lost !
Frame 3 - positionY changed --> send a packet with positionY only.
// Outros jogadores não sabem sobre mudanças de saúde.
Como alguém pode superar esse problema então? nem sempre é possível enviar dados completos.
fonte
Você também pode solucionar o problema enviando uma atualização de estado completa do servidor para os clientes, digamos a cada segundo. Se um cliente não recebeu um pacote, ele se comportará incorretamente até receber a atualização completa do estado. Em seguida, ele estará sincronizado novamente.
fonte
Muitos jogos usam UDP e TCP / IP para enviar / receber dados e, dependendo da frequência com que os dados são enviados, um protocolo diferente é usado.
Por exemplo:
UDP: atualizações posicionais e qualquer outra coisa que possa ser enviada / recebida várias vezes por segundo.
TCP / IP: ações de inventário, ações de feitiço / habilidade (a maioria das ações executadas pelo usuário)
Realmente depende da quantidade de tráfego de cada item. Se você achar que está enviando atualizações da HP com bastante frequência, talvez elas precisem estar no UDP.
fonte
Se você ler a revisão do código-fonte do Quake 3 , ele explica o modelo de rede que é muito semelhante ao seu design, mas com uma solução para os pacotes descartados.
Essencialmente, no seu modelo você está enviando deltas contra o estado diretamente anterior. No modelo quake3, você envia deltas contra o último estado reconhecido do par.
fonte