MushRog

Cem na praça

12 de outubro de 2026 arquiteturabastidores

Pusemos cem jogadores na cidade ao mesmo tempo, cada um com conta, dois personagens e um time, andando à toa e mandando “oi” de vez em quando. Ficaram os dois minutos inteiros sem cair ninguém. Com isso a fase 1 acabou.

Por quê

O roadmap tinha uma condição para sair da fase 1: a cidade aguentar cem pessoas. Preferimos descobrir o limite assim a descobrir com gente de verdade reclamando no chat.

Como funciona

Abrir cem cópias do jogo numa máquina só não dá, então os cem bots vivem num programa só, cada um com conexão, conta e caminho próprios. Para o servidor, são cem pessoas diferentes.

O primeiro resultado foi bom no processamento e ruim na rede. O servidor gastava uns 7 milissegundos por tick, de um orçamento de 50, mas cada jogador recebia perto de 16 KB por segundo. Todo mundo nasce no mesmo lugar, então cada um enxergava uns trinta outros, e as posições iam num formato genérico, cheio de texto.

Trocamos por um pacote binário: um número curto para cada jogador, posição em pixels inteiros e direção em dois bytes. Dá oito bytes por pessoa vista. A banda caiu para 2,6 KB por segundo por jogador, seis vezes menos, o que cabe folgado numa conexão de celular.

Métrica (100 jogadores)AntesDepois
Tick médio do servidor~7 ms~7 ms
Pior tick~40 ms~40 ms
Enviado por jogador~15,8 KB/s~2,6 KB/s

Isso foi numa máquina de desenvolvimento, com servidor e bots dividindo o mesmo processador, então num servidor de verdade deve sobrar mais. O pior tick de 40 ms aparece nos picos, e é ele que vamos vigiar quando a cidade crescer.

Próximo passo

Fase 2: o resto dos sistemas, começando pelo inventário de verdade e pela fazenda.

Mudanças

  • perf(city): 8-byte binary city snapshots; 100-bot load test passes

    CityCodec packs each visible player as u16 id, u16 x, u16 y, s8 dir x/y; static info carries the short id once. Load tool runs many bots in one process with a SceneMultiplayer per bot; server prints tick and bandwidth stats with --stats. 100 of 100 bots stayed in the city for 2 minutes: ~7 ms average tick, bandwidth per player down from ~15.8 to ~2.6 KB/s. Closes fase 1; roadmap moves to fase 2. Protocol 6.

← Todo o devlog