Modelo de rede
- O modelo de rede de Quake 3 é a parte mais elegante do engine e enfatiza que, em ambientes rápidos, informações não recebidas na primeira transmissão não valem a pena ser retransmitidas.
- Usa UDP/IP, e não TCP/IP, porque a transmissão confiável do TCP/IP introduz latência.
- A pilha de rede é estendida com duas camadas mutuamente exclusivas: criptografia com chave pré-compartilhada e compressão com chave de Huffman pré-calculada.
- Destaca-se no lado do servidor um sistema que minimiza o tamanho dos datagramas UDP enquanto compensa a falta de confiabilidade do UDP.
Arquitetura
- O lado do cliente é simples: a cada frame, ele envia comandos ao servidor e recebe atualizações do estado do jogo.
- O servidor precisa propagar o estado mestre do jogo para cada cliente, levando em conta a perda de pacotes UDP.
- Há três elementos principais: o estado mestre do jogo, a transmissão dos comandos do cliente via Netchannel e snapshots armazenados em um buffer circular com os 32 estados de jogo mais recentes.
Sistema de snapshots
- Ao enviar atualizações para o cliente, o servidor sempre copia o estado mestre do jogo para o próximo slot de histórico do cliente e o compara com outros snapshots.
- Se não houver um snapshot válido, usa-se um "snapshot dummy" para gerar uma atualização completa.
- Quando o cliente confirma que recebeu a atualização anterior, apenas atualizações parciais são enviadas.
- Mesmo quando há perda de pacotes, o mesmo processo é seguido, enviando em uma única mensagem tanto as informações não recebidas anteriormente quanto as novas.
Resiliência de memória e C
- Quake 3 compara snapshots sem introspecção, e a posição de cada campo é pré-configurada por meio de arrays e diretivas do pré-processador.
- A estrutura
netField_t é usada para definir a posição e o tamanho dos campos, permitindo transmitir as diferenças pela rede.
Pré-fragmentação
- O módulo NetChannel divide as mensagens em blocos de 1400 bytes antes do envio, evitando que os roteadores fragmentem os pacotes.
- A fragmentação por roteadores é custosa, pois bloqueia os pacotes na entrada da rede e, na saída, exige esperar por todos os fragmentos.
Mensagens confiáveis e não confiáveis
- O sistema de snapshots compensa datagramas UDP perdidos na rede, mas algumas mensagens e comandos precisam necessariamente ser entregues.
- Essa garantia é abstraída por meio do NetChannel.
1 comentários
Comentários no Hacker News