Análise do código-fonte do Serious Engine 1
Visão geral
- Serious Sam foi projetado como um jogo multiplayer.
- A campanha single-player também funciona como multiplayer.
- O Serious Engine oferece suporte a single-player, multiplayer, gravação de demo e reprodução.
Determinismo de ponto flutuante
- Para a sincronização do jogo, o comportamento determinístico das operações de ponto flutuante é importante.
- Como foi lançado apenas para Windows, foi possível evitar problemas de sincronização causados por diferenças de compilador.
- Para resolver problemas causados por diferenças de precisão da FPU, usa-se um guard de precisão.
Tick vs frame
- A taxa de ticks da lógica do jogo é separada da taxa de frames de renderização.
- A lógica do jogo é fixa em 20 ticks por segundo.
- Usa interpolação para movimentos e animações suaves.
Multiplayer em rede
- O modelo de rede do Serious Engine segue o formato cliente-servidor.
- O servidor recebe e processa mensagens dos clientes, e envia as informações relevantes para todos os clientes.
- Usa o protocolo UDP para transmitir pacotes.
Camada de pacotes
- Pacotes UDP podem chegar fora de ordem ou nem chegar.
- O Serious Engine implementa seu próprio protocolo sobre UDP para garantir confiabilidade e ordem dos pacotes.
- Pacotes confiáveis são confirmados por meio de pacotes ACK.
Ciclo de vida da conexão
- Usa pacotes de broadcast para estabelecer uma conexão virtual entre cliente e servidor.
- O servidor atribui um identificador único ao cliente e roteia os pacotes com base nele.
Jogo offline
- Single-player e reprodução de demo são casos especiais de multiplayer.
- Servidor e cliente se comunicam dentro do mesmo processo.
Camada de mensagens
CNetworkMessage é uma abstração de mensagem que pode ser lida e escrita como um stream.
- As mensagens podem ser comprimidas, usando por padrão a compressão LZRW1.
- Usa codificação delta para minimizar a quantidade de dados transmitidos.
Segurança das mensagens
- As mensagens não são criptografadas.
- Mensagens de chat são transmitidas em texto puro.
Opinião do GN⁺
- Útil para desenvolvedores de jogos: A estrutura de rede e os mecanismos de sincronização do Serious Engine podem servir como referência útil para o desenvolvimento de jogos multiplayer.
- Importância do comportamento determinístico: Garantir o comportamento determinístico das operações de ponto flutuante é um fator importante para resolver problemas de sincronização em jogos.
- Projeto de protocolo de rede: Implementar um protocolo próprio sobre UDP para garantir confiabilidade e ordem é um bom exemplo de programação de rede.
- Considerações de segurança: O fato de não haver criptografia de mensagens é algo a considerar do ponto de vista de segurança no desenvolvimento moderno de jogos.
- Desafios técnicos: Ajuda a entender os desafios técnicos de implementar um jogo multiplayer de ritmo acelerado no ambiente de rede do início dos anos 2000.
1 comentários
Comentários do Hacker News
net_bLerping=0no console.