Melhor arquitetura de jogos ponto a ponto

10

Considere uma configuração em que os clientes do jogo:

  1. possui recursos de computação bastante pequenos (dispositivos móveis, smartphones)
  2. estão todos conectados a um roteador comum (LAN, hotspot etc.)

Os usuários querem jogar um jogo multiplayer, sem um servidor externo.

Uma solução é hospedar um servidor autoritário em um telefone, que nesse caso também seria um cliente. Considerando o ponto 1, essa solução não é aceitável, pois os recursos de computação do telefone não são suficientes.

Então, eu quero projetar uma arquitetura ponto a ponto que distribua a carga de simulação do jogo entre os clientes. Por causa do ponto 2, o sistema não precisa ser complexo com relação à otimização; a latência será muito baixa. Cada cliente pode ser uma fonte autorizada de dados sobre ele e seu ambiente imediato (por exemplo, marcadores).

Qual seria a melhor abordagem para projetar essa arquitetura? Existem exemplos conhecidos de um protocolo ponto a ponto no nível da LAN?

Notas:

Alguns dos problemas são abordados aqui , mas os conceitos listados lá são de alto nível para mim.

Segurança

Sei que não ter um servidor oficial é um problema de segurança, mas não é relevante nesse caso, pois estou disposto a confiar nos clientes.

Editar:

Esqueci de mencionar: será um jogo bastante acelerado (um atirador).

Além disso, eu já li sobre arquiteturas de rede no Gaffer on Games .

Dawid
fonte

Respostas:

10

Dê uma olhada neste artigo sobre a arquitetura de rede do Age of Empires II.

Eles conseguiram criar um jogo multiplayer que funcionou muito bem em um Pentium 90 com 16 MB de RAM e uma conexão de modem de 28,8 kB / s. Eles fizeram isso fazendo com que cada jogador execute sua própria simulação, mas sincronize seus comandos.

Eles têm alguns truques inteligentes, eu recomendo.

knight666
fonte
5

Fiz isso em um jogo comercial de corrida PSP, que funcionava tanto em uma rede ad hoc quanto em um ponto de acesso sem fio. (Ou para um servidor estático na Internet, se desejado)

Por causa do ponto 2, o sistema não precisa ser complexo no que diz respeito à otimização

Na minha experiência, isso não é verdade. Dispositivos sem fio (especialmente portáteis pequenos) não são como computadores com conexões de rede com fio - smartphones e consoles de jogos sem fio tendem a ter interfaces de rede lentas para fins de jogos.

Não me interpretem mal - a taxa de transferência é geralmente boa (ou seja, a quantidade de dados por segundo; ótima para streaming de filmes ou etc.), mas a latência na entrega de um pacote específico pode ser extremamente ruim e pode ser altamente variável que é difícil estimar quanto tempo um pacote individual levará para ser entregue. Essa variação se torna ainda pior à medida que mais dispositivos sem fio são agrupados em uma área geral, pois seus sinais começam a interferir entre si. Como resultado disso, passei muito do meu tempo reduzindo o número de pacotes que precisavam ser enviados, para que tivéssemos menos colisões de pacotes. (Observe que isso é um pouco menos problemático no caso de um hotspot de rede ativado, em vez de ter os dispositivos conversando diretamente através de uma rede ad hoc)

Como exemplo desse tipo de otimização, nosso jogo de corrida ocorreu em um mundo que tinha semáforos. Milhares deles. E precisávamos garantir que seus sinais estivessem sincronizados entre todos os jogadores em uma sessão de rede. Em vez de tentar enviar pacotes informando a todos quais luzes estavam em que estado, definimos um cronograma estático para todos os semáforos e apenas garantimos que todos os clientes concordassem com a "hora do jogo" atual. Como todos conheciam a hora do jogo e todos os estados dos semáforos podiam ser determinados a partir da hora do jogo, sincronizamos todos esses dados de estado sem enviar dados especiais. Essa mudança fez uma enorme diferença para o desempenho da nossa rede.

O que foi dito, estabelecer uma sincronização confiável de relógio entre vários dispositivos sem fio (com tempos de ping muito variados devido principalmente à perda de pacotes) foi um grande desafio. É um prazer falar mais sobre isso, se você tiver interesse.

Cada cliente pode ser uma fonte autorizada de dados sobre ele e seu ambiente imediato (por exemplo, marcadores).

Foi isso que fizemos e funcionou bem para nós em nossa situação (carros). A parte problemática, é claro, é quando um objeto deixa de estar mais próximo do jogador 'a' do que do jogador 'b' e, portanto, sua propriedade é transferida de um jogador para outro.

Essa é realmente uma negociação surpreendentemente complexa entre os jogadores, onde o jogo 'a' propõe o jogo 'b': "Acho que esse objeto está mais perto de você. Você deve assumir o controle dele". E então o jogo 'b' pode aceitar, ou pode recusar, com base em sua própria visão da situação. As diferenças no estado de jogo percebido entre 'a' e 'b', e a mudança no tempo entre o envio e o recebimento da solicitação e resposta fazem desta uma negociação particularmente desagradável para se tornar confiável, e pode facilmente degenerar em um jogo de "batata quente", com a propriedade do objeto oscilando continuamente entre vários jogadores. E mesmo quando funciona corretamente, quando visto do ponto de vista do jogo 'c', existe '

Minha intuição é que esse tipo de abordagem de "propriedade de objetos" provavelmente será muito complicada para objetos pequenos e de vida curta, como balas. Nós o usamos para carros de tráfego e corredores de IA, que tendiam a viver na simulação por um tempo relativamente longo. Parece que uma abordagem mais eficiente, se você estiver disposto a confiar nos clientes, seria fazer com que o jogo de cada jogador possuísse sua posição e seus projéteis e declarasse quando esse jogador foi atingido pelo projétil de outra pessoa. (Assim como no "jogo A", sou responsável por dizer onde estão os projéteis do jogador A e do jogador A, mas o jogador B é responsável por dizer se eu bati no jogador B). Com algumas boas estimativas, você deve conseguir um comportamento bastante razoável de um sistema como esse.

Trevor Powell
fonte
1

Eu recomendo que você use a arquitetura ponto a ponto de bloqueio.

Você começa contando os quadros do jogo após o início do jogo. Um cliente renderiza o 1º quadro e envia a mensagem pronta para outros clientes e aguarda para receber a mensagem pronta de outros clientes.

Agora todos os clientes podem ir para o 2º quadro. Renderize o quadro, envie e receba comandos, atualize o mundo, atualize a física e ... depois disso, envie uma mensagem pronta para o outro.

Essa solução é muito boa para jogos de LAN e todos os seus clientes estarão sincronizados.

com esse tipo de rede, você pode ter certeza de que todos os seus clientes estão sincronizados para testar a melhor maneira que atenda às suas necessidades.

A primeira maneira é enviar apenas as entradas para os outros e cada cliente simula corrida, disparo, detecção de colisão e etc. a segunda maneira é que cada cliente envia as informações sobre seu personagem para outras pessoas, como posição, rotação, estado, quadro de animação e etc. calcula as coisas e as envia pela rede, mas a primeira maneira é mais segura.

kochol
fonte
1
Esta resposta parece ser sobre o ciclo do jogo. Eu acho que o OP está perguntando sobre o sistema de distribuição de carga; especificamente, quem simula o que e como os clientes se comunicam. Você poderia entrar em mais alguns detalhes? Também estou interessado neste problema.
23412 Wackidev
@Wackidev com esse tipo de rede, você pode ter certeza de que todos os seus clientes estão sincronizados para testar a melhor maneira que atenda às suas necessidades. A primeira maneira é enviar apenas as entradas para os outros e cada cliente simula corrida, disparo, detecção de colisão e etc. a segunda maneira é que cada cliente envia as informações sobre seu personagem para outras pessoas, como posição, rotação, estado, quadro de animação e etc. calcula as coisas e as envia pela rede, mas a primeira maneira é mais segura.
kochol
Então, por favor, coloque isso na sua resposta. No momento, acho que não responde à pergunta. Além disso, exclua o primeiro comentário duplicado. Obrigado. Quanto à ideia em si, a primeira opção listada não exige que a simulação seja determinística?
24512 Wackidev