Como lidar com movimentos aleatórios em tempo real com previsão do lado do cliente

10

Estou construindo um jogo multiplayer em tempo real que executa o mesmo loop 'físico' no cliente e no servidor. Estou usando um comportamento de direção 'vaguear' que é um movimento aleatório essencial. O cliente e o servidor geram números aleatórios diferentes ao executar os algoritmos de desvio.

Gostaria de saber como posso manter um movimento naturalmente aleatório, mas use alguma constante que garanta que o cliente e o servidor cheguem à mesma conclusão.

kevzettler
fonte
4
Gerar a mesma sequência aleatória a partir de uma sequência numérica pseudo-aleatória é fácil. O difícil é sincronizar o uso dessa sequência. Você precisa tornar sua lógica de jogo determinística, não no sentido de que não está usando uma sequência aleatória, mas para usá-la de maneira determinística. A maneira mais fácil de conseguir isso é geralmente evitar qualquer simultaneidade no loop lógico do jogo, no entanto, é possível ter simultaneidade desde que os encadeamentos não dependam do tempo e da seqüência do PRNG ao solicitar um valor aleatório ao PRNG. Aqui seja dragão.
Lie Ryan

Respostas:

14

Você pode usar semente aleatória . Selecione o mesmo valor de 32 bits no servidor e no cliente (ou o servidor pode enviá-lo ao cliente no início). Use-o como semente para gerador aleatório. Você pode enviar a semente real do servidor para o cliente com a atualização do estado do jogo. Se você não quiser enviá-lo, verifique se o cliente e o servidor geram o mesmo número de números aleatórios por esse gerador aleatório.

O que você deve saber antes de decidir não enviar a semente real ao cliente:

  • Você terá problemas com a seleção de caracteres no cliente (significa não processar caracteres profundamente em uma névoa de guerra no cliente). Se você deseja fazer a seleção de caracteres, a melhor decisão será enviar todos os estados de caracteres (com a semente real) do servidor para o cliente quando o cliente deve processar o caractere. Portanto, o servidor deve decidir quando o cliente deve processar o caractere e quando não deve. Certifique-se de usar geradores aleatórios separados para cada personagem.
  • O mesmo problema será com as filas de IA.
  • O número aleatório desse gerador aleatório deve ser gerado apenas na atualização com delta de tempo fixo. Se você quiser usar um dígito aleatório para interpolação de IA antes da renderização, use um gerador aleatório separado (não há renderização no servidor, portanto, não se preocupe com a semente que usará).
  • Se você quiser usar plataformas diferentes para cliente e servidor (C ++ e Java, por exemplo), deverá implementar (ou encontrar) o gerador aleatório de plataforma cruzada. Esse não é um grande problema, porque os geradores aleatórios são fáceis de implementar.
Kostya Regent
fonte
3

Se o servidor e o cliente concordarem com a semente, a maioria dos algoritmos aleatórios produzirá os mesmos valores.

Lince Assassino
fonte