Técnicas, algoritmos e recursos de MMO para manter a largura de banda baixa?

9

Existem recursos e documentação sobre como os MMOs atuais lidam com os dados de ação e movimento desde a compactação até a manipulação no cliente? Algum recurso para algoritmos de previsão de movimento?

Estou especialmente interessado naqueles que têm movimento wsad e se concentram em manter a latência baixa. Qual é a taxa e o tamanho dos pacotes para diferentes tipos de MMOs (em termos de rede)?

Existe uma maneira de escalar a taxa de pacotes ou desabilitar completamente alguns pacotes se o jogador não puder alcançá-los ou, posteriormente, vê-los?

adrix89
fonte

Respostas:

9

Bem, existe este livro - que é um pouco antigo agora, e eu nunca o li realmente, mas é de uma editora respeitável. Eu também encontrei este , que é mais novo, mas nunca ouvi falar disso antes. Ambos pretendem cobrir problemas de desenvolvimento de jogos MMO (ou pelo menos on-line); dito isso, a previsão do lado do cliente é mais ou menos a mesma, independentemente da escala da sua base de jogadores simultâneos, e o Google tem muitas informações sobre isso .

É importante perceber que, de uma perspectiva prática, é bastante difícil para um desenvolvedor independente de hobby / hobby montar um jogo que seja popular o suficiente para reunir jogadores suficientes para alcançar uma simultaneidade teórica de pico alta o suficiente para ser considerada "maciça". Mas as técnicas ainda podem ser educativas para a pesquisa.

Existem duas classificações principais de coisas que você pode fazer:

  • Seja agressivo ao enviar apenas a quantidade mínima de dados para o conjunto mínimo de clientes que precisam deles.
  • Crie um jogo que não incentive os jogadores a se amontoar demais, ajudando a manter o "conjunto de clientes que precisa" de coisas pequenas em geral.

O segundo é realmente um problema de design de jogo e manipulação social - é especialmente complicado porque os jogos multiplayer são naturalmente sociais, isso faz parte do seu apelo, então você não deseja desencorajar demais grupos de jogadores. Por outro lado, um jogo no qual todos no mundo estão acampando, o único jogador que faz o melhor saque no jogo será difícil de escalar.

Para a primeira opção, você pode considerar fazer mensagens em camadas - há algumas coisas sobre outros jogadores que são sempre importantes saber, como posições. Mas outras coisas, como saúde, podem não ser tão importantes para objetos que o jogador atual ainda não pode ver; portanto, você bloqueia o que envia para esse jogador com base na distância relativa de todas as outras entidades na vizinhança - isso é essencialmente uma limitação os dados que você envia, como você mencionou na última parte da sua pergunta, além de filtrá-los.

Arquiteturas multiplayer em grande escala também armazenam em buffer relatórios que não precisam ser executados imediatamente. As mensagens de salvamento de caracteres enviadas ao servidor podem ser feitas em deltas, com atualizações completas apenas em pontos críticos, e essas atualizações podem ser armazenadas em buffer em um servidor de limitação, para que sejam enviadas ao servidor que realmente mantém os dados de caracteres em constante, moda periódica - à medida que sua base de jogadores é escalada, você precisa se preocupar em otimizar a IO do disco e o tráfego da rede. Você não quer fazer com que seu banco de dados de personagens se debata.

A taxa e o tamanho dos pacotes diferem amplamente de jogo para jogo, da mesma forma que para jogos que não são MMO. É realmente uma coisa muito específica de requisitos e não há padrões generalizados.


fonte
11
Há também uma sequência do primeiro livro (Massively Multiplayer Game Development 2). Na minha opinião, não é uma série de livros muito útil (definitivamente não é um livro de fazer MMO-em-x-horas do início ao fim, como a maioria dos livros sobre desenvolvimento de jogos), mas discute alguns dos problemas teóricos perguntou nesta pergunta. E talvez seja mais útil para alguém que já possui um MMO parcialmente desenvolvido.
Ricket 25/03
5

Além da resposta acima, leia sobre TCP_NODELAY e como o dimensionamento da janela funciona. Compreender os detalhes do TCP (e sim, você deseja usar o TCP e não o UDP, a menos que a perspectiva de lidar com atualizações diferenciais que cheguem fora de ordem lhe pareça divertida) e a retransmissão seja crítica para o controle da latência.

coderanger
fonte
4
Repetirei que, se você estiver usando atualizações diferenciais (normalmente diferenças binárias das estruturas do jogo) e usar qualquer coisa com entrega fora de ordem (confiável ou não), você se arrependerá. As pessoas que não gostam do TCP nos jogos geralmente simplesmente não sabem o suficiente (como saber o que a NODELAY faz). O UDP faz sentido para coisas como dados de voz, em que pacotes fora de ordem podem ser simplesmente descartados, o que raramente acontece em um jogo.
coderanger
11
"raramente acontece em um jogo"? Desde que o servidor esteja me fornecendo estados de jogo com autoridade em todos os quadros, não me importo com o que aconteceu no passado. Um simples número de quadros com aumento monotônico dos pacotes UDP é perfeito para isso. Quantos dados você realmente precisa transmitir de maneira confiável?
ChrisE
2
"Desde que o servidor esteja me dando autoridade no jogo declara todos os quadros" Claro, se você tratar isso como um dado. Observe que eu disse "se você estiver usando atualizações diferenciais", o que seria o oposto de controlar o estado completo de cada quadro. Em um MMO com qualquer nível de complexidade para o mundo, rapidamente se torna impossível enviar atualizações completas com tanta frequência.
coderanger
11
Mesmo que envie o estado completo das coisas que mudam, você acaba com problemas de entrega fora de ordem, onde a fusão das coisas pode se tornar inviável. Pense nas atualizações "x = 1, y = 2" e depois em "y = 1, z = 2". Se chegarem ao contrário, você deseja largar o "primeiro" para que o valor de y esteja correto, mas você perde a alteração para x.
coderanger
11
@ Adam Foi por isso que eu disse que você deveria ler as especificações do TCP e entender como o dimensionamento de janelas funciona e como ele interage com a retransmissão ;-) Reescrever o TCP é basicamente sempre errado, as chances de estragar tudo são quase 100%. Se você deseja uma entrega confiável e em ordem, não deve usar o UDP.
coderanger