Implementando suavização de rede


13

Estamos criando um jogo de tiro em primeira pessoa para multiplicadores. O cliente envia sua posição para o servidor a uma taxa fixa (atualmente em 10Hz). O servidor envia uma única mensagem contatando todas as posições do jogador para todos os jogadores na mesma taxa (10Hz).

Como esperado, o movimento é bastante instável, pois o jogo a 60fps está recebendo atualizações apenas 10 vezes por segundo. Qual é a melhor maneira de suavizar esse movimento? A maneira mais óbvia seria interpolar entre os dois últimos pacotes, para que a interpolação termine à medida que recebemos um novo pacote. Mas isso adiciona um atraso instantâneo de 100ms para todos os jogadores.

A outra maneira seria usar a velocidade e a aceleração inferidas nos últimos pacotes para prever onde o jogador está antes da chegada do próximo pacote; no entanto, se a previsão estiver errada, o jogador tenderá a pular assim que um novo pacote for recebido .

Alguém sabe como os títulos AAA resolvem esse problema?

Respostas:


9

Eles fazem exatamente o que você acabou de dizer - uma dessas duas abordagens ou algum compromisso entre elas. (por exemplo, aceite um pequeno atraso e interpole sempre que possível e extrapole quando o ping exceder esse atraso.) Em vez de pular (também conhecido como 'snapping') de volta para uma posição corrigida, você normalmente faz algum tipo de interpolação entre a previsão errada e o valor corrigido, suavizando-o, se possível. Você também lida com as correções no passado para reduzir a quantidade de correção que precisa aplicar.

Esta é uma pergunta freqüente e há vários links canônicos que você provavelmente encontrará em outros sites em gamedev.stackexchange.com, se você pesquisar, e eles incluem o seguinte:

O que todo programador precisa saber sobre redes de jogos (isso resume as coisas nos próximos dois links)

Rede multijogador de origem

Arquitetura de rede irreal

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.