Como devo acompanhar as posições em tempo real dos jogadores em um MMO?


14

Como você acompanha as posições dos jogadores em um MMORPG? Eu li que você pode usar um banco de dados ou pode armazenar as coordenadas em arquivos. Eu tentei usar um banco de dados, mas foi lento. Como os arquivos podem ser usados ​​para acompanhar as posições dos jogadores?

Respostas:


23

Como os arquivos podem ser usados ​​para acompanhar as posições dos jogadores?

Você escreve a posição do jogador no arquivo. Por exemplo, se você identificar cada jogador com um número único (ou um GUID), poderá usá-lo como o nome do arquivo. No arquivo, basta escrever os dados da posição em um formato que você possa analisar posteriormente. Por exemplo, 467239.txtpode conter 20, 3, 19se o jogador # 467239 estiver no local ( x, y, z ).

Porém, isso não é tão diferente do que você faria com um banco de dados - um banco de dados não deve ser "lento" nesta operação, deve ser muito rápido (provavelmente mais rápido que os arquivos, porque você tem mais sobrecarga de IO do disco ou bloqueio de IO contenção - se você armazenou várias posições por arquivo - em uma abordagem baseada no sistema de arquivos).

Talvez você estivesse tentando usar o banco de dados ou o sistema de arquivos para armazenar a posição do player em tempo de execução ? Você não deve fazer isso .

Em tempo de execução, no servidor, as posições dos jogadores devem ser mantidas na memória e atualizadas lá, como você faria com qualquer outro tipo de jogo. Periodicamente, eles podem ser salvos no disco ou em outro armazenamento persistente - por exemplo, quando o player descansa, salva ou efetua logout.

Mas escrever todas as posições dos jogadores para armazenar todas as atualizações é desnecessário e extremamente ineficiente; nunca será rápido o suficiente para lidar com algo semelhante a balanças de jogadores "maciças".


11
Sim, na verdade, eu estava salvando a posição do jogador em um postgreSQL em tempo de execução. Mas, se eu o mantiver na memória do servidor, como posso atualizar a posição nos clientes?
Baccari

12
O método pelo qual o cliente é atualizado é o mesmo em todos os casos: o servidor informa ao cliente qual é sua posição por meio de uma mensagem de rede (ou, mais realista, o cliente que está fazendo previsão local, também possui uma posição local que o servidor valida e confirma para o cliente). Você não deve ter seu cliente acessando o banco de dados que o servidor está acessando.

11
Sinto falta de dizer "faça isso com um arquivo", apenas para explicar que é realmente pior do que usar o banco de dados e depois explicar qual é o problema real. Por que você precisa dessa explicação inútil de arquivo em primeiro lugar? Apenas confunde o leitor casual, o que não beneficia ninguém.
o0 '.

6
Tem sido minha experiência no passado que ignorar perguntas diretas e simplesmente passar a palestra sobre o que eu acho que "o caminho certo" deve ser tende a ser mais conflituoso e torna o OP menos receptivo a se afastar da base mais fraca que sua pergunta original é. vindo, isso é tudo.

13

A posição deve estar na RAM enquanto estiver em uso. (ex: o personagem do jogador está no mundo) Você não pode usar o DB como memória operacional. Bem, você pode, mas isso será terrível.

Você deve salvar as posições regularmente, mas não sempre que elas mudarem.

Eu também evitaria salvar todas as posições ao mesmo tempo. Se você quiser manter a persistência em caso de falha do servidor, salve a posição o mais rápido possível, mas no tempo livre do jogo. Simplesmente faça isso por lotes.

Salve 30 posições enquanto o tempo livre estiver disponível.

Quanto aos clientes. Eles devem receber atualizações (relevantes) do estado do jogo por meio de uma conexão com o software do servidor. Não do DB ... Isso seria impraticável, lento, ruim, mau e a força seria perturbada.


2
E sim, use um thread separado para evitar situações em que o banco de dados possa bloquear o restante do loop do jogo.
Coyote

4

Eu tenho uma thread separada na fila para salvar em arquivos a cada 500 ou mais ticks de jogo. Caso contrário, você deve armazenar tudo na RAM.


4

O que faço no meu servidor é armazenar a direção dos jogadores (vetor) e a última posição. Se o jogador tiver velocidade, eu calculo a nova posição dos jogadores a cada 2 segundos.

O cliente tem sua própria posição de posição e envia uma nova direção (vetor) para o servidor.

O servidor é autoritário sobre a posição e envia um pacote de posições se o cliente se moveu a uma certa distância desde a última verificação (isso pode levar ao efeito de elástico, se o cliente estiver fora de sincronia).

Tudo isso acontece na memória, é claro.

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.