Solução eficiente para particionamento de espaço multiplayer?

10

Essa pergunta é um pouco complicada, mas tentarei deixar claro.

Digamos que estou criando um jogo on-line (não em escala MMO), mas que suporte o maior número possível de jogadores, em uma abordagem de servidor autorizada. Quero mundos realmente grandes com muitos inimigos simulados pela IA.

Estou ciente de algumas estratégias para economizar a CPU do servidor subdividindo o espaço e não processando o que não precisa de processamento. Já dividi o mundo por regiões, o que exigirá tempos de carregamento e pequenas transições, o que acho importante manter a qualidade da jogabilidade ao jogar localmente (sozinho ou mesmo com alguns amigos). Não espero que os jogadores estejam em mais de uma ou duas regiões.

O problema é que uma região pode se tornar bem grande e ter muitos NPCs simulando ao mesmo tempo. Como faço para lidar com isso sem afetar a experiência dos jogadores? Abordagens como um servidor por região e similares não estão na tabela.

Estou procurando principalmente estruturas de dados para conter hordas de inimigos e até NPCs pacíficos. Para finalizar a pergunta, observe que existem veículos, portanto é consideravelmente rápido viajar dentro de uma região, influenciando o "quando" para selecionar as áreas.

Grimshaw
fonte
Você está restrito a apenas um servidor físico?
Patrick Hughes
Em última análise, não. Mas para o bem de ambos simplicidade e possibilidade de realização, por agora, eu não posso complicar o projeto ainda mais :)
Grimshaw
Comece simples. Algo como o WoW que opera em várias caixas físicas por "servidor" apenas divide seu mundo em uma grade e toda atualização é baseada em quem está nas mesmas caixas que você. Muito simples, fácil de ajustar, funciona bem e você pode usá-lo com apenas uma caixa para controlar o processamento.
Patrick Hughes
Concordo plenamente com o seu ponto de vista e talvez tenha perdido algo na minha pergunta. E se houver um jogador à direita da célula da caixa e outro à esquerda da célula vizinha da direita? Eles deveriam se ver! O mundo parece continuar para um jogo como o WoW. Isso é o que eu não entendo, como fazer uma grade mundial contínua, mantendo-a eficiente? Certamente há situações em que jogadores de dois "servidores" deve ver o outro :)
Grimshaw
1
E sim, se você vai ter muitas coisas por toda parte e muitos jogadores por toda parte, você realmente precisa planejar que tudo seja ativo em todos os lugares e o tempo todo, sem nenhuma maneira mágica de contornar isso. É por isso que caixas únicas de um grupo de servidores MMO atendem apenas de 200 a 500 jogadores no máximo E por que a IA do MMO para NPCs é pateticamente estúpida (também conhecida como computação barata).
Patrick Hughes

Respostas:

5

Pelo que entendi, você terá algum tipo de física rodando no seu servidor.

Nesse caso, também existem outras técnicas disponíveis para IA / física que não o particionamento espacial. Do mais ao menos óbvio:

  • prioridade: NPCs sem interação direta com jogadores podem receber menos tempo de CPU diminuindo a taxa de atualização. Você pode usar filas de prioridade e executar filas com a maior prioridade do primeiro ao último, enquanto outras filas executarão apenas 1/2, 1/4 ou 1/8 da fila a cada ciclo. Dessa forma, você garante que cada objeto seja executado em algum momento, mas reduz o número de vezes que consome CPU.
  • a física também pode ser reduzida (apenas as caixas e esferas de colisão podem ser usadas em roaming e longe da vista).
  • simplificando a IA / simulação alocando comportamentos muito básicos para os NPCs e o ambiente enquanto os jogadores estão longe. Geralmente ele estará em roaming ou procurando inimigos em vez de caçar, reunir, cultivar ...
  • alguma física e IA também podem ser delegadas aos clientes. Se você realmente não tiver CPU nos servidores, poderá marcar o objeto como parcialmente resolvido e os clientes ajustarão a física e a posição desses objetos localmente (para evitar NPCs flutuantes). Os clientes podem ter alguma responsabilidade na execução da IA ​​(durante o combate contra um jogador, o dispositivo do jogador alvo pode estar executando diretamente os NPCs atacantes)
  • para os jogadores, a física também pode ser reduzida no servidor e os clientes receberão mais responsabilidade na resolução de colisões. Ex: se você acertar um objeto com seu veículo, o servidor só resolverá a colisão nas caixas de colisão e marcará os objetos como potencialmente em colisão. O cliente enviará a resolução ao servidor com um carimbo de data / hora que a aceitará se os objetos forem marcados e a solução parecer correta.

Depois de implementar esses mecanismos, você pode decidir quanto e com que frequência precisa deles. O melhor disso é que, mais tarde, você poderá adicionar alguns servidores que poderão assumir algumas das tarefas em vez dos aplicativos clientes.

É claro que a detecção de colisão aproximada criará algumas aberrações, mas você poderá resolvê-las adicionando mais precisão de tempos em tempos.

Também sobre física, você deve dar uma olhada nas bibliotecas que suportam algum tipo de sistema GPGPU como OpenCL ou CUDA, se você tiver acesso a um servidor que também suporte.

Coiote
fonte
Combinar particionamento de espaço de uma região com atualizações prioritárias deve ser exatamente o que eu preciso, ideal para pequenas quantidades de jogadores e ainda otimizado quando muitas áreas são carregadas. Obrigado.
Grimshaw
@DevilWithin Deve ajudar, e não requer alterações no lado do cliente. Também adicionei mais alguns detalhes à resposta.
Coyote
A IA simplificada é uma ideia maravilhosa. Enquanto o NPC está longe de ser um jogador, ele não precisa fazer nada além de se mover na maioria dos casos. Isso significa que eu posso apenas fazer uma aproximação do que eles estão fazendo, a cada 1 minuto ou algo assim, apenas para fazê-los circular pelo mundo. Imaginando-os como zumbis, eles o fariam!
Grimshaw