Pergunta

Eu tenho alguma experiência em fazer multijogador turn-based jogos usando soquetes, mas eu nunca tentou um jogo de ação em tempo real. Que tipo de questões extras que eu tenho que lidar com isso? Preciso manter um histórico de ações do jogador em caso ficou para os jogadores fazer algo no passado? Eu realmente preciso usar pacotes UDP ou TCP será suficiente? O que mais?

Ainda não decidi realmente o que fazer, mas para o propósito desta questão, você pode considerar um jogo 2D 10 jogadores com o movimento X Y.

Foi útil?

Solução

  • 'cliente-servidor' ou 'peer to peer' ou algo entre: qual computador tem autoridade sobre quais as ações do jogo.

Com os jogos baseado em turnos, normalmente é muito fácil simplesmente dizer 'o servidor tem autoridade final e estamos a fazer'. Com os jogos em tempo real, muitas vezes, que o design é um ótimo lugar para começar, mas assim que você adicionar latência do movimento cliente / acções sente indiferente. Então você adicionar algum tipo de 'esconder a latência' permitindo a entrada de clientes para afetar seu caráter ou unidades imediatamente para resolver esse problema, e agora você tem que lidar com questões de reconciliação quando o cliente e servidores gamestate começa a divergir. 9 vezes outta 10 que muito bem, você pop ou Lerp os objetos o cliente tem afetado até a posição de autoridade, mas que 1 em cada 10 vezes é quando o objeto é o avatar do jogador ou algo assim, que a solução é inaceitável, assim que você começar dar a autoridade cliente sobre algumas ações. Agora você tem que conciliar os vários gamestates no servidor, e se abre para uma potencialmente 'traindo' através de um cliente mal-intencionado, se você se preocupa com esse tipo de coisa. Este é basicamente onde cada teletransporte / dupe / whatever bug / fraude vem à tona.

Claro que você poderia começar com um modelo em que 'cada cliente tem autoridade sobre os 'seus' objetos' e ignorar o problema batota (multa em muito poucos casos). Mas agora você está vulnerável a um enorme efeito sobre a simulação do jogo se esse cliente cai fora, ou mesmo 'só cai um pouco atrás em manter-se com a simulação' - efetivamente cada jogo os jogadores vão acabar por ser / sentir os efeitos de uma retardando ou de outro modo de baixo desempenho do cliente, sob a forma de um ou outro de espera para ficar para o cliente para recuperar o atraso, ou tendo o estado de jogo que eles controlam fora da sincronização.

  • 'sincronizado' ou 'asynchronus'

Uma estratégia comum para garantir que todos os jogadores estão operando no mesmo gamestate é concordar simplesmente na lista de entradas jogador (via um dos modelos descritos acima) e, então, jogar a simulação jogabilidade fora de forma sincronizada em todas as máquinas. Isto significa que a lógica de simulação tem que corresponder exatamente, ou os jogos vão sair de sincronia. Este é realmente mais fácil e mais difícil do que parece. É mais fácil porque um jogo é apenas um código, e código praticamente executa exatamente o mesmo quando é dar a mesma entrada (mesmo geradores de números aleatórios). É mais difícil porque há dois casos em que não é o caso: (1) quando você usar acidentalmente fora aleatória de sua simulação jogo e (2) quando você usa carros alegóricos. O primeiro é corrigida por ter regras / afirmações rígidas sobre o que RNG são usados ??por quais sistemas de jogo. Este último é resolvido por não utilizar flutuadores. (Carros alegóricos realmente tem 2 problemas, que eles funcionam de forma muito diferente com base na configuração de otimização do seu projeto, mas mesmo que foi trabalhado, eles trabalham de forma inconsistente entre diferentes arquiteturas de processador atm, lol). Starcraft / Warcraft e qualquer jogo que oferece uma 'repetição' mais provável usar este modelo. Na verdade, ter um sistema de replay é uma ótima maneira de testar se o RNG está hospedado em sincronia.

Com uma solução asynchronus as autoridades estaduais jogo simplesmente transmitir esse estado inteiro para todos os outros clientes em alguma freqüência. Os clientes Take That dados e bater que em sua gamestate (e normaly fazer alguma extrapolação simplista até se chegar a próxima atualização). Aqui é onde 'udp' torna-se uma opção viável, porque você está enviando spam todo o gamestate cada ~ 1 seg ou mais, deixando cair alguma fração dessas atualizações é irrelevante. Para os jogos que têm relativamente pouco estado do jogo (terremoto, world of warcraft) esta é muitas vezes a solução mais simples.

Outras dicas

Existem alguns fatores envolvidos na criação de multijogador

  1. O protocolo, é importante que você decida se deseja TCP ou UDP. UDP tem menos sobrecarga, mas não é garantida a entrega. Por outro lado TCP é mais confiável. Cada jogo terá o seu protocolo preferido. UDP, por exemplo, irá trabalhar para um shooter em primeira pessoa, mas pode não ser adequado para um RTS onde a informação precisa ser consistente

  2. Firewall / Connection. Ter certeza que seu jogo multiplayer não tem que fazer 2000 conexões de saída e usa uma porta padrão de modo portforwarding é fácil. Interface com janelas firewall provavelmente será um bônus adicional.

  3. A largura de banda. Isto é importante, a quantidade de dados que você está com a intenção de empurrar através de uma conexão de rede? Eu acho que isso vai descer para jogar testar e gravar o rendimento. Se você está exigindo mais de 200kb / s para cada cliente que você pode querer repensar algumas coisas.

  4. Load Server. Isso também é importante, quanto de processamento é exigido por um servidor para um jogo normal? Você precisa de algum servidor núcleo super 8 com 16GB de RAM para executá-lo? Existem maneiras de reduzi-lo?

Eu acho que há montes mais, mas realmente você quer um jogo que é confortável para jogar através da rede e através de uma variedade de conexões.

O planejamento é seu melhor amigo. Descobrir o que as suas necessidades são verdadeiramente.

A carregar dados: É cada computador vai ter os mesmos modelos e gráficos, e apenas nomes e locais são movidos através da rede. Se cada jogador pode personalizar seu caráter ou outros itens, você terá que mover esses dados ao redor.

Cheating: você tem que se preocupar com isso? você pode confiar no que cada cliente está dizendo. Se não, então você lógica do lado do servidor será diferente do que a lógica do lado do cliente. Imagine isto caso simples, cada um de seus 10 jogadores podem ter uma velocidade de movimento diferente por causa de power-ups. Para minimizar traindo você deve calcular o quanto cada jogador pode mover-se entre as atualizações de comunicação a partir do servidor, caso contrário, um jogador poderia cortar lá acelerar e nada poderia detê-los. Se um jogador é sempre um pouco mais rápido do que o esperado ou tem um salto de uma só vez, o servidor seria apenas reposicioná-los no local mais próximo que era possível, porque é provável que a inclinação do clock ou uma interrupção de uma vez em comunicações. No entanto, se um jogador está em constante movimento duas vezes, tanto quanto possível, em seguida, pode ser prudente para expulsá-los do jogo. Quanto mais matemática, mais partes do estado jogo você pode verificar novamente no servidor, o mais consistente o jogo será, aliás isso vai fazer batota mais difícil.

Como peer to peer é: Mesmo que o jogo vai ser peer to peer, você provavelmente vai querer ter um jogador iniciar um jogo e usá-los como um servidor, isso é muito mais fácil do que tentar gerir algumas das abordagens baseadas mais em nuvem. Se não houver nenhum servidor, então você precisa trabalhar um protocolo para resolver disputas entre 2 máquinas com estados de jogo inconsistentes.

planejamento Novamente é o seu melhor plano de amigo, Plano, Plano. Se você pensar sobre um problema o suficiente, você pode pensar o seu caminho através maioria dos problemas. Então você pode começar a pensar sobre o que você ainda não resolvidos.

Como importante é evitar batota? [Você pode confiar em qualquer informação proveniente de um cliente ou eles podem ser confiáveis ??e autenticados?]

modelo de objeto Como os objetos são comunicadas a partir de uma máquina para outra? Como são ações realizadas em um objeto?

Você está fazendo cliente / servidor ou peer to peer?

números aleatórios Se você fizer um peer to peer, então você precisa para mantê-los lock-passo e os números aleatórios sincronizado.

Se você está fazendo cliente / servidor, como você lida com lag? [Conta inoperante?]

Há uma série de problemas não-triviais envolvidos na rede de codificação.

Confira RakNet tanto é livre para código de download e é grupos de discussão.

TCP é bom se sua corrida em uma LAN. Mas se você quiser jogar online, você deve usar UDP e implementar seu próprio TCP-like camada:., É necessário passar jogar roteadores NAT

Você precisa escolher entre Peer-to-peer ou comunicação cliente-servidor. No modelo cliente-servidor, sincronização e estado do mundo são mais fáceis de implementar, mas você pode ter uma falta de reactividade online. Em Pee-to-peer é mais complicado, mas mais rápido para o jogador.

Não mantenha história da ação do jogador para fins de jogo (fazê-lo, mas apenas para a funcionalidade de repetição). Se você chegar a um ponto onde é necessário, preferem fazer todo jogador espera.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top