Devlog #5 · Replicação
Com espaço e interesse funcionando, veio a camada que transforma mudanças do estado do mundo em dados para os clientes: a replicação.
O servidor precisa saber o que mudou, decidir o que cada jogador precisa receber, compactar no menor formato possível e enviar com prioridade correta — tudo dentro do orçamento de um tick.
Por componente, não por entidade
A replicação funciona por componente, não por entidade inteira. Posição muda todo tick. HP muda em combate. Aparência raramente muda. Cada tipo de dado tem prioridade e cadência próprias.
Dirty bits marcam o que mudou desde o último envio. A fila de replicação prioriza por distância e relevância: primeiro quem está perto, depois quem está em combate, depois o resto. Keyframes garantem que um cliente novo receba o estado completo antes de começar a receber deltas.
Quantização e deltas
Posições são quantizadas para caber em menos bytes. Após o baseline inicial — "aqui está essa entidade, estado completo" — só deltas são enviados: "posição mudou, HP caiu". Isso reduz volume de forma drástica em mundos com muitos objetos em movimento.
Canais separados para cada tipo de dado: crítico, movimento, estado médio, dados lentos, ambientação distante. Se uma fila enche, o sistema sabe o que pode atrasar e o que não pode.
Bench / validação
— Marcar componente sujo: p50 0.55 ns por chamada
— Construção do plano de replicação: p50 435 µs
— Encode de posição: 4 ns por entidade
— 5 canais com prioridade e comportamento distintos
— replication_framing_errors_total = 0 no soak de 1h
Próximo: transporte de rede — o canal que leva esses dados até o cliente.