Devlog

Devlog #6 · Transporte de rede

A replicação decide o que enviar. O transporte decide como.

MMORPGs usam UDP, não TCP. TCP tem controle de congestionamento, retransmissão automática e entrega em ordem — bom para arquivos, péssimo para posição em tempo real. Se a posição de um jogador chegou atrasada, a última versão já foi substituída. Reenviar posição velha piora a experiência.

Confiabilidade por canal, não por pacote

Nem toda mensagem precisa da mesma garantia. Spawn e despawn de entidade precisam chegar com garantia — se sumirem, o cliente fica com fantasmas. Posição é fire-and-forget: o próximo delta já substitui o atual.

Foi criado um stack UDP próprio com ACKs, retransmissão seletiva, janela de recebimento e coalescing de mensagens. Vários deltas de posição são agrupados num único datagrama antes de sair — economiza cabeçalho e reduz syscalls.

Thread de recebimento dedicada

A recepção UDP ganhou thread dedicada. ACK de pacote reliable sai imediatamente — sem esperar o próximo tick do servidor. Isso reduziu RTT de loopback de ~78 ms para menos de 20 ms.

Versionamento de protocolo

O handshake inclui versão do protocolo. Cliente com versão incompatível é rejeitado na entrada. Sem isso, uma mudança no formato dos pacotes vira bug silencioso que só aparece em produção.

Bench / validação
— Envio por transporte: p50 300 ns no caminho interno
— Coalescing até ~1.200 bytes: p50 200 ns
— Soak Phase 5: 1h / 100k entidades / 10 clientes loopback
— retransmissões relevantes = 0 / bytes dropados = 0
— RTT loopback após recv thread dedicada: ~78 ms → < 20 ms

Próximo: persistência — o mundo que sobrevive a um restart.