Como estruturar um servidor de jogo simples para um jogo multiplayer?

9

Gostaria de criar um servidor de jogo multiplayer simples para um jogo simples:

O jogo deve ser semelhante ao Command & Conquer, você tem alguns tanques e alguns soldados. Você pode selecionar um soldado e clicar no mapa, para onde o soldado deve ir. Se o soldado chega a uma área onde não podia ir, ele anda por aí. E soldados podem ser abatidos por inimigos.

Como devo estruturar o servidor do jogo e o que deve ser feito no cliente?

Ou seja, se um soldado se move de X para Y, mas ao redor do prédio Z, acho que o servidor deve ser capaz de calcular exatamente onde o soldado está localizado (no caso de um inimigo atirar nele), e o cliente também precisa saber a posição para pintando o soldado.

O que deve ser feito no servidor e acho que tenho que criar um protocolo para isso. Eu acho que o servidor precisa acompanhar o estado do jogo e a hora. Alguém está tendo sugestões sobre como fazer isso? ou poderia recomendar alguma leitura?

Jonas
fonte

Respostas:

12

Em geral, esse é um assunto muito complexo. Você tem dois objetivos conflitantes (pelo menos se não planeja executar todos os jogos em um servidor dedicado):

  1. Você deseja fazer o máximo possível no servidor, para evitar trapaças e para garantir que todos os clientes vejam o mesmo.
  2. Mas você também quer que as coisas sejam justas, o que significa que se uma pessoa faz um ping no tempo zero para o servidor enquanto outras têm um atraso na rede, quando ambas emitem um comando para suas unidades ao mesmo tempo, o jogador do "servidor" tem uma vantagem .

Não sei exatamente como resolver isso para um RTS. O que fazemos para disparar o FPS é fazer com que o servidor salve um estado mundial completo há um tempo e permita que o cliente registre a hora de cada disparo. Quando a mensagem de rede para "eu demiti!" atinge o servidor, o servidor pode reverter o mundo e fazer testes de colisão, etc. no mundo "como procurava o cliente quando o tiro foi disparado".

Se você planeja ter muitas unidades, também terá o problema de potencialmente ter muito processamento para o servidor manipular. Se você não está terrivelmente preocupado com hackers ou trapaceiros, sugiro fazer buscas de caminho nos clientes e enviar os resultados disso para o servidor.

Ainda outra opção pode ser colocar o peer2peer nele, deixando cada cliente lidar com as atualizações para as equipes locais, mas isso abre a questão de como determinar quem determina o que e assim por diante.

Dependendo de quão complexo é esse projeto e de quanto esforço você está disposto a gastar nele, minha melhor sugestão seria decidir algo preliminar e começar a trabalhar nele para testá-lo.

fatia de limão
fonte
11
Na verdade, existem três (ou talvez mais) objetivos conflitantes. O terceiro é o desempenho, manter e atualizar totalmente o estado de um jogo em tempo real no servidor utiliza muitos recursos.
Bart van Heukelom 28/07/10
2
Ah, e você pode resolver facilmente o # 2 introduzindo um atraso artificial que é igual à média do atraso dos outros jogadores. Bem, se você pode chamar de "tornar ruim para todos" uma solução, é isso.
Bart van Heukelom
@ Bart: parcialmente verdade, mas é claro que deve haver um limite para a quantidade de atraso que você introduz artificialmente, ou conexões mais lentas podem constantemente forçar as conexões mais rápidas a ficarem muito atrasadas, o que definitivamente é agora o que você deseja.
o0 '.
Encontrar o melhor caminho não é problema se for feito no cliente, desde que ele o encontre envie a solução para o servidor, que - como em todo movimento - verifica se está correto.
o0 '.
2

Existem basicamente duas abordagens:

  1. Cliente confiável
  2. Cliente não confiável

O cliente confiável é um pouco mais complexo, mas tem a vantagem de você poder descarregar grande parte de sua computação do servidor. O custo da operação do servidor é um dos maiores problemas para jogos com vários jogadores e reduzirá seriamente sua escalabilidade.

Uma boa abordagem (para iniciantes) é permitir que cada cliente de jogador lide com suas próprias unidades. Na próxima etapa, você pode usar ciclos de reposição para permitir que os clientes dos jogadores verifiquem as ações de outros clientes. O servidor não precisa fazer mais do que trocar mensagens, mantendo a sincronização e garantindo a persistência (por exemplo, banco de dados).

Se você planeja ter algum tipo de lobby ou bate-papo, lide com cada um desses tópicos em um servidor extra. Isso tornará as coisas muito mais fáceis no futuro.

Andreas
fonte
Obrigado, isso foi informativo. Acho que vou procurar clientes não confiáveis ​​e devo fazer o trabalho no servidor. Não terei muitos jogadores no começo.
Jonas
11
"Não terei muitos jogadores ..." Não posso contar o número de desenvolvedores que me informaram e voltaram seis semanas depois com: "Tenho esses 5000 jogadores querendo pagar para jogar meu jogo, mas não posso escalar :( ". Apenas tenha isso em mente!
Andreas
9
"Cliente confiável" não é uma abordagem, é um erro.
o0 '.