Quero criar um simples jogo multijogador em tempo real cliente-servidor como um projeto para minha classe de rede.
Eu li muito sobre modelos de rede multiplayer em tempo real e entendo as relações entre o cliente e o servidor e as técnicas de compensação de lag.
O que eu quero fazer é algo semelhante ao modelo de rede do Quake 3: basicamente, o servidor armazena um instantâneo de todo o estado do jogo; ao receber a entrada dos clientes, o servidor cria um novo instantâneo refletindo as alterações. Em seguida, calcula as diferenças entre o novo instantâneo e o último e as envia para os clientes, para que eles possam estar sincronizados.
Essa abordagem parece realmente sólida para mim - se o cliente e o servidor tiverem uma conexão estável, apenas a quantidade mínima necessária de dados será enviada para mantê-los sincronizados. Se o cliente ficar fora de sincronia, um instantâneo completo também poderá ser solicitado.
No entanto, não consigo encontrar uma boa maneira de implementar o sistema de instantâneos. Acho realmente difícil me afastar da arquitetura de programação para um jogador e pensar em como eu poderia armazenar o estado do jogo de tal maneira que:
- Todos os dados são separados da lógica
- As diferenças podem ser calculadas entre o instantâneo dos estados do jogo
- As entidades do jogo ainda podem ser facilmente manipuladas via código
Como uma classe de instantâneo é implementada? Como as entidades e seus dados são armazenados? Toda entidade cliente possui um ID que corresponda a um ID no servidor?
Como as diferenças de instantâneo são calculadas?
Em geral: como seria implementado um sistema de instantâneos no estado do jogo?