Construindo um mundo aberto no navegador, parte 11: Modo baseado em políticas, não modo hardcoded
Por Oleg Sidorkin, CTO e cofundador da Cinevva
Chegou agora? Consulte o guia da série. Ele explica o que é um spike e reúne links para todas as partes.
Depois do capítulo sobre o caos das emendas, precisávamos parar de reagir e começar a governar.
O Spike 23 substituiu comportamentos improvisados por regras explícitas de política. Em vez de cada chunk fazer o que seu estado local sugeria, um sistema central de políticas passou a tomar as decisões. Qual nível de LOD este chunk recebe? Ele é renderizado como heightmap ou marching cubes? Precisa de células de transição e, se sim, em quais faces? As respostas vinham de uma função de política que avaliava a distância até a câmera, o histórico de edições e os estados de resolução dos vizinhos.
Abrir o Spike 23 em uma nova aba ↗ · Ver código-fonte
A atribuição de LOD baseada em distância usava anéis concêntricos ao redor da câmera, de maneira semelhante ao conceito de clipmap, mas aplicada à grade de chunks. Os chunks do anel 0 recebem MC em resolução máxima. O anel 1 recebe MC em meia resolução. O anel 2 e os seguintes recebem o modo heightmap. A restrição de adjacência era crucial: para quaisquer dois chunks vizinhos, exigimos
A lógica de alternância entre HM/MC verificava o bitmap de edições de cada chunk. Se um chunk tivesse qualquer edição volumétrica (cavernas, túneis ou terreno esculpido), ele permanecia no modo MC independentemente da distância. Chunks sem edições podiam passar para o modo heightmap quando se afastavam o suficiente. Essa abordagem híbrida nos deu liberdade volumétrica onde ela importava e eficiência onde não importava.
Visto de fora, este spike parecia menor do que alguns dos anteriores. Na prática, foi uma grande melhoria na qualidade de vida durante o desenvolvimento.
Quando seu sistema consegue explicar por que um chunk mudou de modo, você passa menos tempo tentando adivinhar. Adicionamos sobreposições com códigos de cores: verde para chunks de heightmap, azul para chunks de MC e laranja para faces com transições ativas. Quando a visibilidade das emendas tem controles de renderização dedicados, a ambiguidade da depuração visual diminui. Quando os intervalos de desenho são vinculados explicitamente às contagens de vértices ativos fornecidas pelo sistema de políticas, os fantasmas de geometria obsoleta deixam de desperdiçar sua tarde.
Também reformulamos o comportamento da câmera neste spike. Os spikes anteriores tinham controles simples de órbita, adequados para capturas de tela, mas inúteis para reproduzir bugs. O Spike 23 adicionou uma câmera de voo com WASD, velocidade configurável, opção de travar a altitude e exibição da posição. Isso parece algo pequeno. Mas representou a diferença entre "vi um bug em algum lugar perto daquela cordilheira" e "o bug aparece na posição (142, 12, -67), com a câmera voltada para noroeste".
O principal aprendizado deste capítulo é que a política não reduziu a complexidade. Ela organizou a complexidade. A mesma quantidade de casos extremos continuava existindo. Mas agora cada caso extremo tinha um nome, uma condição de disparo e um ponto no código onde era possível definir um breakpoint. Esse é outro tipo de vitória, e é isso que determina se um sistema pode continuar evoluindo ou se entra em colapso sob o próprio peso.
Ao final do Spike 23, tínhamos uma camada previsível de comportamento de campo próximo, pronta para ser conectada a uma estratégia de anéis de clipmap para o campo distante sem o medo constante de bugs de interação.
Na parte 12, abordamos o Spike 24, em que as transições entre anéis, a névoa do skybox e a integração de shaders no nível de versão do Three.js encerram este capítulo do projeto.
Tecnologias mencionadas neste capítulo
Política de LOD baseada em distância. Uma função central que atribui o nível de LOD e o modo de renderização a cada chunk com base na distância até a câmera, no histórico de edições e nos estados dos vizinhos. Anéis concêntricos de distância determinam o LOD base: anel 0 = MC em resolução máxima, anel 1 = MC em meia resolução, anel 2+ = modo heightmap. A função de política é executada a cada quadro conforme a câmera se move e aciona as transições dos chunks. Isso substitui decisões improvisadas por chunk por um sistema de regras previsível e fácil de depurar. Consulte Seleção de LOD orientada pela GPU para ver o equivalente em compute shader.
Restrições de adjacência. O algoritmo Transvoxel lida apenas com proporções de resolução de 2:1. Se dois chunks vizinhos diferirem em mais de um nível de LOD (por exemplo, LOD 0 ao lado de LOD 2), as tabelas de transição não conseguem produzir uma geometria de emenda válida. O sistema de políticas aplica essa regra aumentando a resolução do chunk com menos detalhes quando a diferença de LOD ultrapassa 1. Essa propagação de restrições pode ocorrer em cascata: aumentar a resolução de um chunk pode forçar seus vizinhos a fazer o mesmo. A implementação é uma passagem iterativa simples que converge em 2 a 3 iterações nas configurações de grade mais comuns.
Bitmap de edições para seleção de modo. Cada chunk mantém um bitmap que registra se ele contém edições volumétricas de SDF (cavernas, túneis ou partes esculpidas). Chunks com qualquer edição permanecem no modo marching cubes independentemente da distância, preservando as modificações do criador. Chunks sem edições passam para o modo heightmap quando estão suficientemente distantes da câmera, economizando processamento e memória. O bitmap consiste em um único sinalizador por chunk, mas pode ser ampliado para registrar a densidade de edições e permitir decisões de modo mais granulares.
Sobreposições para depuração visual. Renderização de chunks com códigos de cores, em que verde = modo heightmap, azul = modo MC e laranja = faces com transições ativas. Sobreposições por chunk com números de nível de LOD, rótulos de modo e opções para ativar a visualização em wireframe. Essas são ferramentas de desenvolvimento, não recursos entregues no produto, mas compensam o investimento repetidamente durante a depuração de transições de LOD e artefatos nas emendas. Combinadas a uma câmera de voo com WASD que informa a posição exata no mundo, elas transformam "vi um bug em algum lugar" em "o bug aparece em (142, 12, -67) com esta configuração de LOD".
Parte 11 de 12.
Anterior: Parte 10 — O caos das emendas e a batalha contra o chefe dos cantos
Próxima: Parte 12 — Anéis, névoa no céu e o que faríamos novamente
Guia da série: /pt-BR/blog/2026-02-25-open-world-browser-series-guide