Fazer bom cliente para múltiplos jogadores / mmo <> Jogos de servidor usam a latência dentro de cálculos de movimento?

StackOverflow https://stackoverflow.com/questions/1448997

Pergunta

Há um par de perguntas aqui.

Imagine que eu tenha o cliente A quem é que vai enviar a seguinte mensagem para o servidor: "INÍCIO movimento para frente"

O servidor não receberá esta mensagem instantaneamente, já que há um atraso devido à latência.

Pergunta 1: mesa de ping (ou melhor: Round Trip Time ) é a quantidade de tempo que leva para o cliente para enviar uma mensagem para o servidor e receber uma volta resposta. Será que isso significa o seguinte, se você pode ignorar o tempo que leva para o servidor a notificação que recebeu uma mensagem e começar a enviar uma resposta (isto deve ser muito curto)?

  1. tempo que leva para o cliente para enviar someting para o servidor = round-trip-time / 2
  2. tempo que leva para o servidor para enviar algo para client = round-trip-time / 2

Assim, quando o cliente A envia a mensagem, o servidor irá supostamente receber essa mensagem de ida e volta em tempo / 2 milissegundos após o cliente tem enviar a mensagem. Isto leva-me para a próxima pergunta.

Pergunta 2: se o cliente em primeiro lugar enviar o pacote, e depois esperar-trip-time redonda / 2 milissegundos antes de executar que do lado do cliente de comando (neste caso: move para a frente)? ??Compensar com a latência / lag

Agora, o servidor irá enviar a seguinte mensagem a todos os jogadores próximos: "CLIENTE A está agora a avançar". Esses clientes, então, certifique-se que o caráter do cliente um começa a se mover, isso me leva à próxima pergunta.

Pergunta 3: Caso o cliente receber a mensagem de que um outro cliente mudou levar em conta que esta mensagem foi enviada pelo round-trip-time servidor / 2 milissegundos atrás? Assim que o tempo atual usado para cálculos de movimento timestamps deve ser reduzida em round-trip-time / 2?

Todos estes métodos faria em minha mente make certeza que a sincronização melhora entre clientes, como a latência é levado em conta. É este o caminho certo de fazer as coisas? Que a maioria dos outros jogos de boa multijogador fazer isso? Quaisquer comentários, sugestões, alternativas ou gritos aleatórios, mas relacionados que você gostaria de dar? Agradecemos antecipadamente.

Foi útil?

Solução

Eu acho que na maioria mmo do seu cliente, principalmente se move sem interação com o servidor a menos que ocorra mau lag. O servidor reproduz o movimento com a ajuda das mensagens que o cliente enviar para o servidor. Assim, se por exemplo as defasagens do servidor, o cliente irá parar recebendo feedback do servidor e reverter para a posição o servidor determinar que você está. É por isso que você saltar para trás vários quadros durante o mau lag. Desta forma, o servidor também terá controle sobre sua velocidade para que você não está speedhacking. Se seus movimentos cliente em uma determinada taxa que é sobre a velocidade determinada pelo servidor, você poderia simplesmente saltar para trás os quadros extras.

Outros clientes não iria deixá-lo passar em todos, sem resposta do servidor dentro de um determinado período de tempo. Este é o tempo que você experimentar 'congelar-lag'.

É claro que há também ocorrências em que o servidor simplesmente assumir a posição de enviado pelo cliente e cegamente confia nele. Estes são os jogos que são geralmente vulneráveis ??a hacks de teleporte.

Quando se trata da posição de outros jogadores lá realmente é um atraso, que pode ser visto se você tomar dois computadores, conectar a um jogo como wow e mover os dois personagens simultaniously. Você veria que em ambos os computadores o caráter não-local começará a se mover depois que você realmente começou a se mover ele.

O cliente geralmente têm algum tipo de compensação lag. Então, se outro jogador está se movendo em uma certa direção e depois pára, o seu cliente ainda irá simular o movimento de que o jogador até que você receber uma mensagem do servidor que ele mudou de direção ou parou de se mover. É por isso que outros jogadores podem saltar para trás e para a frente quando o ping é alta. É também por isso os jogadores podem parecem apenas slide / run / pé quando você bate lagspikes e, em seguida, retornar à sua posição real quando seus clientes recebem posições a partir do servidor.

Claro que isso muda de motor para motor, mas é um aproach bastante geral.

Edit: Esqueci de acrescentar que é muito comum para que o servidor também compensação uso lag. Se você bater em alguém em um MMO que está na gama de você, essa pessoa pode não estar ao alcance dos servidores visualizar. Assim, o servidor leva a latência para ambos os seus clientes e tenta igualar-se se você fosse realmente na faixa de eachother ou não.

Outras dicas

Esta é uma questão de idade, mas eu tenho trabalhado para fora um código semelhante recentemente, então talvez isso vai ajudar alguém.

Sim latência é sempre útil no cálculo. Mas é um pouco mais complexo do que o RTT. tempo de ida e volta está sempre mudando ... o seu código de rede pode manter uma média, mas a variação do que média é grande.

O cliente local, cliente remoto e servidor tudo prever a posição atual usando algoritmos. Os dados a seguir está perto de típico:

  • Time: t
  • Colocação: Posição (x, y, z) e de orientação (x, y, z, w)
  • Movimento: Linear movimento vector dando direcção com o comprimento como a velocidade (x, y, z), e vector de movimento de rotação dando eixo com o comprimento como a velocidade de rotação (x, y, z)

Você precisa dos algoritmos que extrapolar a partir de um [T, P, M] definido para o simtime. Eu não vou estar fornecendo esses aqui.

Quando o cliente registra uma mudança na unidade do navio no [T, P, M], que não vai ficar para o servidor até T + deltaT. Mas se deltaT está dentro da tolerância de latência de rede típicos, o servidor pode dizer "Sim, aconteceu em T, eu aceito isso." Caso contrário, ele pode querer corrigir o cliente dizendo "Sem isso é fora da tolerância, que aconteceu no meu tempo T'", caso em que o cliente terá que repetir todo o posteriormente conduzido [T, P, M] alterações do servidor de corrigido um (ou seja, você precisa manter uma fila ou lista deles).

O próximo cliente irá obtê-lo em T + deltaT + differentdeltaT. Ele não pode mudar o que já simulado, por isso, se ele não está atrasando-o de simulação que vai saltar do navio remoto e você vai ver um quadro idiota. É por isso que os navios movidos remoto deve ter suas simulações adiada por um tempo consistentemente superior a 2 * typicaldeltaT. Deve haver um atraso constante, ou um atraso que muda gradualmente, e em tempos de atraso grave você vai ver quadros empurrão no entanto

Você pode suavizar todos os empurrões com código de suavização extra, mas não fazê-lo até o seu código é outra forma impecável, porque ela só vai torná-lo impossível ver onde estão os problemas.

Você deve ter uma boa sincronizado referência de tempo. Um monte de código lá fora faz isso em vez sloppily (por exemplo RakNet não faz (ou não) fazer isso muito bem). Aqui está uma boa dica: no curto prazo, você pode presumir relógios que de todos estão em execução no mesmo ritmo, e você só precisa descobrir o que o deslocamento é, de modo a manter uma janela de máximo e mínimo offset e fechá-lo como você aprende; No longo prazo, você precisa para compensar clientes cujos relógios são correndo rápido ou lento, então permitir que a janela para abrir se você sabe com certeza que deve. Você deve usar um timesource local que é monótona crescente e não introduzidos fora da velocidade do processador (que hoje em dia é variável).

Não, não demora a simulação local quando os locais "Avatar" se move. Parece muito indiferente. Você poderia atrasar ligeiramente (até talvez 50ms) para ajudar a melhorar a sincronização, mas um atraso todo o caminho para o RTT iria fazer o seu jogo parece frustrantemente sem resposta. Define uma opção para atraso local e brincar com ele, porque um pequeno atraso consistente pode ser aceitável e melhorar a sincronização. Mas não é necessário e pode causar muitos problemas, então eu recomendo fazer esse código passado. (Se você está tentando fazer um jogo corpo a corpo FPS, você vai precisar fazer isso e todo o outro tipo de ajuda você pode obter).

Como para enganar suavidade prevenção vs. simulação: Em primeiro lugar, os clientes devem não apenas extrapolar a partir da última posição conhecida, quando as mudanças oficiais de posição. Ele deve registrar um vector de ajuste e mova lentamente a partir do caminho antigo para o novo caminho para a lisura (mas como eu disse acima fazer isso último código ou ele vai mascarar outros bugs). Em segundo lugar, o servidor deve tolerar uma ampla gama de atrasos ... mesmo em máquinas na mesma ethernet o atraso de pacotes normalmente é executado 5ms para 100ms ou assim ... que é uma gama bastante. Claro que você precisa para cortar-lo e dizer "se você diz que mudou no tempo T, mas eu tenho o pacote em T + some_large_number então eu acho que você está tentando ajustar o passado e mentindo para mim." some_large_number não deve ser muito maior que o RTT médio para manter as pessoas honestas.

As simulações nunca vai ser bem sincronizado. Eles devem permanecer dentro de 400ms ou assim através da Internet, mas certamente vai desviar fora do que em épocas de lag ... 30 segundos ou mais, e você precisa tolerar coisas que que porque eles não são raros. Dado que a Internet é limitado pela velocidade da luz em cobre, você sempre pode esperar de sentido único latências ser tipicamente na faixa de pelo menos 100 ms mínimo para seus clientes distantes, muitas vezes 500ms ou mais.

Por isso eu recomendo que você não tente fazer um jogo FPS corpo a corpo através da Internet (algumas grandes empresas tentam, mas sempre terá problemas). Há truques que você pode fazer se você estiver usando projéteis (executando-los rapidamente em um de simulação e lento na outra), de modo que mesmo que o tempo está fora, ele observa. Além disso, jogos de FPS usar a regra de que de detecção de sucesso é baseado na simulação atacantes ... ele se sente mais errado quando o atacante sabe que ele estava morto no alvo e perde, então, quando um defensor sabe que ele estava fora do caminho e é atingido enfim. Você tem que escolher um ou outro, e psicologicamente é assim que tem sido feito. Corpo a corpo requer um nível de sincronização que é francamente impossível ea maioria das empresas de jogos não vai tocar MMORPG FPS corpo a corpo, mas sim usar auto-targetting (tentar jogar Mortal Online, você vai ver o que quero dizer).

Boa sorte.

para Q1:. Que parece certo para mim

Q2: A maneira que eu tenho feito isso no passado é: se você quer que as coisas se sentir ágil, começar a executar a ação instantaneamente na simulação do cliente, em seguida, o servidor simula frente no jogo em tempo quando a pessoa iniciou a ação . ou seja, o cliente sabe no que ms no tempo de jogo-simualation que começaram, assim, o servidor pode iniciá-lo naquele tempo também (nota: este é sempre para trás no tempo de carrapato atual do servidor, então você tem que salvar de volta estado no tempo para fazer isso).

Q3: os clientes só precisa realmente de saber que eles estão simulando no momento X, eo servidor diz que o conjunto de eventos {A, B, C} aconteceu às vezes {X, Y, Z}. Em seguida, o cliente eo servidor pode simular a frente com a mesma informação e geralmente permanecer em sincronia (exceto quando ocorrem conflitos simultâneos). Nesses casos, você tem as coisas servidor re-sincronização para que você geralmente acabam dentro de uma margem bastante apertada de erro e uma experiência principalmente suavizar.

Se o seu objetivo é melhorar a percepção de latência que você pode também apenas tentar confiar no cliente.

Existem vários modelos de rede para resolver estes problemas;

Em jogo de rede, é preciso sincronizar duas coisas, uma é tempo, outro é espaço.

  1. Um modelo de jogo em rede chamado lockstep;

você deve ter um olhar para o artigo escrito por idade de estúdio de jogos empire2, que descrevem detalhes no modelo de sincronia.

Neste modelo, do cliente e jogo de corrida servidor estrutura lógica a quadro, por exemplo, RTS usar 100ms como uma moldura, servidor e cliente irá sincronizar quadro Id, o que significa tempo de sincronização.

Cliente no quadro 50, Enviar comando MoveForward, mas não executá-lo imediatamente, o cliente vai dizer servidor para executar comando de movimento no quadro 51; em seguida, quando quadro 51 vem, servidor e cliente irá executar o comando, ao mesmo tempo. portanto o cliente e lógica do servidor será a mesma.

Em tal modelo, no quadro 50, o cliente eo servidor será executado comando emitido no quadro 49 talvez, por isso não são sempre 100ms ou mais atraso no retorno de entrada do cliente.

o desfasamento entre o cliente eo servidor não só contém rede RTT, mas também contém atraso quadro lógica, que é 100ms;

Neste modelo, o espaço sync, você precisa fazer o seu código de cliente e código do servidor determinística, então eles só podem comando sync e frameId, não há necessidade para o estado de entidade sincronização.

Neste modelo, o feedback de entrada é grande, então você precisa para jogar animação ou som a ajuda jogador ignorar o lag.

  1. outros modelos usam estado de sincronização

Neste modelo, precisamos também de tempo de sincronização, assim que o cliente vai adivinhar o que o tempo atual em servidor.

quando a entrada do jogador, movimento cliente imediatamente, em seguida, enviar comando de movimento ou pos-alvo cliente para o servidor com hora e data atual do servidor, que é estimado pelo cliente.

Quando o servidor recebe o comando do cliente, ele sabe quando o comando é emitido em vez do servidor pelo cliente, ele vai tentar executar o comando com extrapolação.

todos os outros clientes irão receber o comando, com o tempo de servidor, os todos os outros clientes vai tentar extrapolar o comando.

Essas tecnologias incluem Previsão do Cliente, a compensação Lag Server, Entidade Servidor interpolação.

Neste modelo, o feedback entrada do cliente é curto, mas por algum comando impulso, como o uso de habilidade, ainda precisamos método de uso sincronia, com animação, som e efeitos de partículas para a composição do tempo de feedback de entrada.

Em jogo de rede, há comandar pelo menos dois tipos, primeiro como movimento, o comando será executado por um determinado período de tempo, como um fluxo constante, que tem o atributo de continuidade.

o outro como usar habilidade com tempo frio, efeito comando levará em impulso, devemos tratá-los de forma diferente.

Alguns bons jogos multiplayer usa um mecanismo para permitir que os jogadores se movem suavemente mesmo sob pesadas tempos de ida e volta, permitindo que o cliente para decidir e enviar a posição do jogador para o servidor. Existem mecanismos de verificação de fraude, mas cliente é livre para isso. Então, se o tempo de ida e volta vai wacko você vê pessoas pulando de lugar em lugar, enquanto você está se movendo suavemente. Mesmo alguns jogos MMO levá-lo para a próxima fase, permitindo que o cliente para lidar com conteúdo único jogador sem o consentimento do servidor. Somente estatísticas, relatórios de batalha e algumas outras informações é enviado para o servidor, juntamente com poucos dados de fraude verificação.

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