Como funcionam os jogos multiplayer online?
Por jogos multiplayer online, vou assumir que você se refere a um jogo em rede, onde há um ou mais nós/computadores conectados entre si.
Basic Structure
Within the game, there are generally two types of nodes:
- Server: Hospeda o jogo e responde a pedidos>li>li>Cliente: Conecta-se ao servidor e envia requisições
Então, de que tipo de requisições estamos falando aqui? Eles podem ser qualquer dado. Por exemplo, em um jogo de Starcraft, você moveu um Marine, let's o chama Bob, para as coordenadas hipotéticas (20, 10). Seu cliente envia uma requisição ao servidor para mover aquele marine para (20, 10).
Neste ponto, o cliente e o servidor podem ter dois estados diferentes, dependendo se o código de rede (netcode) é baseado em infraestrutura de servidor autoritária ou não.
Em uma abordagem de servidor autoritária, o servidor tem a palavra final se a requisição é registrada e válida ou ignorada e descartada. Se a resposta for válida, ela irá atualizar o remetente, ou seja, você e todos os outros clientes conectados sobre a requisição.
Em um servidor não autorizado, o cliente não precisa esperar pela resposta do servidor's para poder continuar com o jogo.
Cenário do mundo real
Let's voltam para o jogo de Starcraft. Como você emitiu a ordem para Bob ir para (20, 10), seu oponente, o outro cliente, precisa ser informado de sua ação e mover Bob na tela dele. Se o Starcraft, se aproximasse do servidor não autorizado e seu pedido nunca chegasse ao seu oponente, isso significaria que a versão de Bob do seu oponente's poderia não estar na mesma coordenada que a sua versão de Bob! O que acontece se lá ele tivesse emitido um comando para mover seu enxame de zerglings alguns segundos antes das mesmas coordenadas? Quem agora tem o estado correto do jogo?
Então parecia que ter um servidor autoritário resolveria todos os problemas; espere por ele -- ele faz't. Mais especificamente com precisão e latência. Estes dois fatores são os maiores desafios para construir um jogo online multiplayer.
Precisão: Como os clientes são homogêneos e como poucos pedidos/respeitos são descartados ou perdidos.
Latência: O tempo necessário para uma requisição chegar ao servidor e sua resposta para chegar até você.
Caso estes problemas têm origem na falta de confiabilidade da internet. Para mais detalhes. leia Confiabilidade (rede de computadores).
Para garantir a Precisão, é preciso garantir que todos os pedidos e respostas estejam em ordem e que nenhum deles seja perdido por nenhum dos clientes; o estado de cada cliente também tem que ser o mesmo, o que significa que quando um dos clientes é um estado diferente (ou seja, alguém tem uma conexão intermitente), todos os outros clientes têm que chegar a esse estado antes que qualquer um possa fazer qualquer mudança. Este é o seu caso comum do `lag` em Starcraft.
Para garantir a Latência, é preciso garantir que o cliente não sinta nenhum ponto de atraso entre o pedido do seu cliente e a resposta do servidor. Além de reduzir o número de links que seu cliente conecta ao servidor ou hospedar o servidor no seu cliente (ou seja, zero hops de rede cliente-servidor), não há outras formas de melhorar isso.
Não há atualmente nenhuma solução que possa garantir precisão perfeita e nenhuma latência (a menos que você esteja falando de jogos de um único jogador) e, portanto, um trade-off tem que ser feito. Seja para garantir uma latência mais baixa mas com baixa precisão ou alta precisão mas com alta latência.
Por favor, vota se isto responde às tuas perguntas. :)