Pergunta

Estive lendo este artigo da Valve que parece explicar a arquitetura de sua sistema de multiplayer. Parece que eles atrasar prestação por um casal carrapatos no cliente para que eles possam lidar com pacotes perdidos, mas eles também enviar pacotes como "instantâneos delta" (a diferença entre dois estados adjacentes).

Suponha que tenhamos vezes A, B, C, e o cliente estejam corretas no momento A, mas descarta o pacote em B, e, em seguida, recebe o um em C. Como pode corretamente deduzir o estado em tempo de C? O pacote em C só diz (eu acho) o delta entre estados B e C, eo cliente só sabe o estado em A. O que estou ausente aqui?

Foi útil?

Solução

Os deltas não tem que ser relativo à mensagem anterior que foi enviado (pelo delta ou instantâneo). Em vez disso, eles seriam em relação à última reconheceu Estado. Assim, no exemplo acima, a atualização em C poderia ser um delta em relação ao A. Perder portanto mensagem B se torna um inconveniente como os deltas estão ficando maiores (e potencialmente erro está acumulando), mas, eventualmente, uma mensagem vai passar e ser reconhecido, e o servidor pode começar a enviar deltas relativos a esse estado atualizado.

Outras dicas

O estado completo é sincronizado periodicamente ou a pedido do cliente. interpolação / extrapolação pode ser usado para compensar a perda de pacotes enquanto espera por uma atualização de posição completo. Alguns eventos exigem a entrega reliabe e um meio de acusar a recepção poderia ser acrescentado.

Glenn Fiedler tem algum excelentes artigos sobre os jogos em rede em seu < a href = "http://gafferongames.wordpress.com/" rel = "nofollow noreferrer"> blogue .

Este antigo artigo sobre Quake 3 rede soa similar. Os estados do delta representam alterações do último cliente reconheceu estado que foi recebido. Assim, se o servidor vê que o cliente está por trás, em seguida, a próxima delta será criado a partir da diferença entre o estado cliente e o estado atual do servidor.

Sem olhar para a implementação, eu imagino que o pacote C também inclui o ID do pacote é o delta de (neste caso, pacote B).

Quando o cliente recebe pacote C seguinte pacote A, ele vai saber que ele não tenha visto pacote B ainda, e, consequentemente, pode solicitar uma atualização completa do servidor.

Eu estou supondo que de vez em quando eles enviam um instantâneo completo. é por isso que jogos laggy envolvem pessoas correndo na velocidade errada como quadros delta são descartados, então "teletransporte" para a posição correta quando um instantâneo completo vem em.

A partir do artigo ligado:

Normalmente completos (não-delta) instantâneos são enviados apenas quando um jogo começa ou um sofre de clientes de perda de pacotes pesado para um par de segundos. Os clientes podem solicitar um snapshot completo manualmente com o comando cl_fullupdate.

O servidor provavelmente envia totalmente sincronizado (ou seja, não deltas) periodicamente, mas com menos frequência. Isso é o que estou fazendo, pelo menos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top