Desenvolvimento inicial Ainda não há versão pública · FPS tático 5v5 · PC
Novidades
O que mudou, medido
O diário público do desenvolvimento. Sem datas de lançamento e sem «em breve»: se algo não avançou, esta página diz o que o travou.
Diário · atualizado em
Marco a marco, com sua medição
Uma entrada por marco verificado: o que mudou, o número com seu cenário, o link para a evidência e o que foi testado e descartado, com a medição que o descartou. O que ainda não está medido diz «pendente», e o que espera a prova de uma pessoa também o diz. Nenhuma fase é declarada encerrada aqui.
· F1–F6 · ADR 0017 O hash coincidia no Clang porque dizíamos, não porque fosse comprovado
O arquivo de hashes fixados do projeto e a página de evidências afirmam que um milhão de passos de simulação dão o mesmo hash em três builds: GCC otimizado, GCC com sanitizers e Clang. A verificação completa compilava dois. Agora compila as três e compara os três hashes em cada corrida, e se não encontrar o Clang falha em vez de pular a pata. As três dão a59ca4f6e2299d88 no corpus de movimento e f7d2406fd5b56d4d no de combate, com 72.863 tiros e 3.478 acertos. No mesmo movimento se publicou o registro da verificação completa de 24 set 2026, que é de onde saem o tick, a largura de banda e a cena de render que o site publica.
Clang 21.1.8, GCC otimizado e GCC com sanitizers dão os mesmos dois hashes que estão fixados, a um milhão de passos cada um
Se não houver Clang, a verificação completa falha: antes a pata era pulada em silêncio e a afirmação ficava sem comprovação
O registro dessa verificação completa já está publicado entre os registros em cru, com as sete cifras do site que respalda e com o que não respalda
A árvore inteira ainda não compila com Clang: duas constantes duplicadas e sem uso no código de OpenGL quebram a compilação com os avisos como erros. As duas sondas de determinismo não arrastam render, então a pata nova roda igual; fica anotado em vez de escondido
As três patas, um milhão de passos cada uma Movimento a59ca4f6e2299d88 e combate f7d2406fd5b56d4d no GCC otimizado, no GCC com sanitizers e no Clang 21.1.8, com 72.863 tiros e 3.478 acertos nas três. Os dois hashes são os que o arquivo do projeto tem fixados e não se moveram.
Testado e descartado
Degradar o aviso do Clang com um envoltório do compilador para que a árvore compilasseO envoltório existia só para que uma constante sem uso deixasse de quebrar a compilação. Medido antes de apagá-la: essa constante não entrava em nenhuma conta, porque as 18 poses do rig saem idênticas com seu valor da árvore, com 0 e com 90 graus, com a mesma impressão nos três casos, e a seção de código do objeto compilado é a mesma antes e depois de apagá-la. Era código morto: foi apagado e não faz falta nenhum envoltório.
Dar por coberta com esse registro a cena povoada do mapa vestidoO plano dizia que o registro cobria as quatro primeiras linhas do painel de orçamentos, e cobre três e meia: sua porta de render é o campo de tiro vazio, 4,1434 ms, e a cena povoada, 9,6242 ms contra 8,3333 de objetivo, é de um ADR do dia seguinte. O registro o diz em seus limites, e a lista de cifras sem registro publicado continua tendo entradas.
Publicar o log cru da verificação junto ao registroOs registros publicados até hoje trazem o arquivo e o sha256 do seu log, não o log, e esse critério se mantém: o log se pede por correio e esse sha256 serve para comprovar que o que chegar seja o mesmo com que se mediu. Mudá-lo para um registro e não para os outros treze deixaria a pasta menos legível, não mais.
EvidênciasOs registros, em cru · a árvore inteira ainda não compila com Clang por duas constantes mortas no código de OpenGL, e a cena povoada do mapa vestido continua sem registro publicado
· F5 · ADR 0101, 0102 A parede se lembra do tiro, e o corpo fica de pé como um soldado
A marca de bala era um cubo de cor plana de 1,8 cm que caducava aos 10 s. Agora é um quad com textura e alfa no plano da face atingida, com a luz assada dessa mesma parede, três famílias de material e quatro formas cada uma: 192 vivas, a rodada inteira, e são apagadas ao trocar de rodada. Em paralelo, a marcha foi corrigida onde importa, nos dados dos dois rigs, e não baixando valores no cliente.
O quad mede 6,0 cm e a cratera 1,8: o 1,8 era o tamanho do buraco e estava sendo usado como o de toda a marca
Critério de aceitação cumprido: trinta tiros a 40 cm deixam quinze buracos separados, sem a mancha que havia sido rejeitada
Tornozelo a tornozelo em pé 35,5 → 29,0 cm e ponta a ponta 49,1 → 34,3, assado nos dois rigs
Falta que uma pessoa jogue e aceite: a postura e as marcas são validadas pelo fundador (checkpoint H3)
O deslocamento de peso da pelve em pé fica bloqueado por decisão humana: 0 mm de percurso
Custo do quadro no pior caso, placa de referência+0,09 ms / 8,3333
Divergência entre o corpo desenhado e suas caixas de impacto em pé 6,17 → 2,91 cm e ponta 9,49 → 2,09: a justiça melhora com o assado, não piora
Testado e descartado
Colocar o sampler das marcas no sombreador do mundoO quadro passou de 1,97 a 4,72 ms sem desenhar uma única marca: esse programa fica justo de registradores na placa de referência. Os decalques têm seu próprio programa, e qualquer alavanca que acrescente um sampler ao programa compartilhado tem de ser medida mesmo que não desenhe nada.
Corrigir a postura baixando três valores do clienteDeixava o tornozelo desenhado uns 5,4 cm para dentro do das caixas de impacto, ou seja, o pé fora da sua caixa. Assado nos dados, a divergência em pé cai de 6,17 para 2,91 cm.
EvidênciasStatus do projeto · verificação rápida 12 de 12, portão de desempenho verde nas duas cenas com nova linha de base gravada, e referências visuais aceitas nos dois repositórios
· F6 · ADR 0099, 0100 O contrato do cabo fica escrito, e o pior caso media menos
O servidor falava o protocolo 11 e a API de agentes 10, mas a documentação do cabo chegava à 10 e declarava 8 para a API. Agora está escrita a partir do código e não do diário: o bloco da bomba com seus 18 bytes e suas regras de quem sabe o quê, a ação de usar, e a ordem canônica completa do snapshot com o tamanho de cada bloco e quem recebe cada um. Cada tamanho foi comprovado codificando de verdade: um snapshot vazio mede 136 bytes.
O pior caso real de descida 5v5, uma IA viva sob modelo motor, é de 795 bytes e 55.552 B/s com cabeçalhos, e não 54.400: sobram 8.448 B/s de margem contra o teto de 64.000
Não há regressão de orçamento: era uma conta que media menos, e o teste fixa agora as duas famílias de cifras, com objetivo e sem ele
O que ficou sem margem, e se anota em vez de se esconder: o formato admite até dezesseis assentos, e esse caso daria 65.152 B/s com o bloco da bomba, acima do teto. Oferecer uma partida de dezesseis assentos com objetivo precisa antes de uma decisão escrita e de uma pessoa
Pior caso de descida por cliente, 5v5 com objetivo55.552 B/s / 64.000
Testado e descartado
Subir o teto de largura de banda para que a bomba entrasseNada foi subido nem baixado: o teto continua em 64.000 B/s. O que estava errado era a conta, que não somava os 18 bytes da bomba mesmo que viajem em todos os snapshots de uma partida com objetivo.
Deixar o comentário de versão e a lista de pendências como estavamO comentário do cabeçalho dizia 10 com a constante em 11, e a lista declarava pendente a adaptação de relógio entre máquinas, que está implementada e testada desde a v2. As duas divergências foram corrigidas na mesma mudança.
EvidênciasStatus do projeto · as tabelas de bytes publicadas na documentação para desenvolvedores ainda descrevem uma versão antiga do cabo e são atualizadas antes de abrir o SDK
· F3b · ADR 0098 O relógio de apresentação desenha onde você aponta
O cliente desenhava 0,80 ticks atrás do snapshot mais novo em vez dos 2 que o próprio desenho pedia, e 4,7 % dos quadros deixavam o corpo remoto parado. A causa: o erro que governa o relógio era medido depois de adiantar seu objetivo, então o controlador lia um erro do tamanho de um quadro inteiro e o relógio corria adiantado. Daí que o atraso fosse menor quanto pior estava a máquina. Agora o erro é medido antes e o objetivo é arrastado em vez de replantado.
Atraso 0,8006 → 1,2674 ticks e diferença entre desenhar e apontar 0,458 → 0,001
Quadros abaixo de um tick 65,65 % → 20,91 %, congelados 0,93 % → 0,65 %, passo máximo sobre a média 1,102 → 1,064
O buffer de interpolação não foi tocado: custa 7,3 ms mais de ver os outros com atraso, que é exatamente o que o desenho pedia
Falta jogá-lo, e medir de novo a porcentagem de quadros congelados com o cliente conectado
Reprodução banco determinista sem rede: 0,800649 de atraso e 65,65 % de quadros abaixo de um tick, iguais à partida conectada
Testes 115 casos e 88.357 asserções nos testes de rede; verificação rápida 12 de 12
Testado e descartado
Baixar o teto do corte do relógioOs quadros congelados pioraram para 1,49 %.
Dar mais autoridade ao controlador do relógioOs congelados subiram para 3,35 %.
EvidênciasStatus do projeto · as duas tentativas descartadas ficaram anotadas com sua medição, para que ninguém as tente de novo às cegas
· F6 · ADR 0089, 0094 O radar do gênero, sem entregar um único inimigo
O servidor manda agora onde estão os companheiros vivos mesmo que não sejam vistos, que é o radar do gênero. Viajam assento e posição, 13 bytes, e nada mais. A regra com que se decidiu: se um campo muda por algo que acontece fora dele, não entra. Assim ficam de fora vida, arma, gatilho e mira, porque mudam quando há um inimigo perto: para onde olha um companheiro parado é onde está o inimigo que ele vê. E um jogador morto já não olha para o chão: espectra pelos olhos de um companheiro vivo, com a percepção desse companheiro e sem seus eventos privados.
Custa zero no pior caso do cabo: um companheiro está entre os visíveis ou no bloco novo, nunca nos dois
Espectar um companheiro ao morrer viaja em 17 bytes e elimina um apagão medido de até 2:17 olhando para o chão
As IAs recebem o mesmo, no mesmo tick e com os mesmos bytes, e sem atraso de percepção: saber onde está o próprio time não aponta para ninguém
Que não vaze um inimigo é comprovado pelo plantel, pelo codificador e pelo decodificador, separadamente
Pendente de decisão: desenhar o contorno do companheiro através da parede custa +0,16 ms no pior caso, cinco companheiros cobertos, contra uma margem de 0,05 ms. A alternativa barata, limitá-lo aos dois mais próximos, está proposta e não aplicada
Contorno do companheiro coberto, pior caso, contra a margem disponível+0,16 ms / 0,05
Testado e descartado
Um contador de companheiros sempre presente no snapshotTeria custado 1 byte e levado o caso de dezesseis assentos de 64.000 B/s exatos a 64.064. Em vez de baixar o orçamento mudou-se o desenho: o bloco só aparece quando há algo para mandar.
EvidênciasAntifraude primeiro · são as duas únicas exceções a «ninguém recebe o que não poderia perceber», e as duas estão escritas com seus bytes
· F5 · ADR 0092 Variedade de material no mapa a custo zero, e o céu deixa de faixear
Três peles por bairro escolhidas com um hash fixo, famílias que não se cruzam e o material físico conservado: a bala encontra o mesmo que antes. E dois ajustes de imagem que saíram de uma revisão por eixos: o tramado antes de quantizar a 8 bits, e a amostragem completa de cada pele de modelo, que era enviada com metade da configuração enquanto o array do mundo já levava as três.
Pixels sem textura local: mediana 39,8 % → 32,6 %, por +180 triângulos sobre 15.920, zero texturas, zero camadas e zero chamadas de desenho novas
Props a zero graus 16 → 4, e ângulos distintos 24 → 45
Tramado antes de quantizar a 8 bits, custo 0,00 ms: o céu faixeava uma faixa a cada 6,7–10 px
Mipmaps, anisotropia ×8 e viés −0,5 ao subir cada pele: o corpo conserva 99 % do detalhe legível e perde 6 % do ruído perto de Nyquist, e a arma conserva 96 %
Falta que uma pessoa olhe em partida: a identidade visual e a legibilidade são validadas pelo fundador (checkpoint H3)
Custo do tramado no quadro+0,00 ms / 8,3333
Testado e descartado
Colocar o tramado antes da suavização de bordasNessa ordem o pior canal dava 42, porque a suavização decide bordas por limiar de luminância e meio nível muda a decisão. No seu lugar, depois, dá 1.
Deixar a amostragem pela metade nas peles de modeloSem anisotropia a arma conservava entre 90 e 92 % do detalhe legível, contra 96 % agora.
EvidênciasHardware e orçamentos · o material físico não mudou, então a penetração e o dano de cada parede continuam os mesmos
· F3b · ADR 0087, 0088 O traçante parou de mentir, e o comando é aplicado com um único código
O feixe que o cliente desenhava no momento do clique não era o tiro que o servidor resolvia: o cliente não sabe qual bala saiu até o servidor lhe dizer. Agora o feixe é desenhado pela resposta do servidor para essa mesma bala. E cliente e servidor passaram a preparar e aplicar o comando com o mesmo código, em vez de com duas ordens de operações parecidas.
O feixe honesto não custa um byte novo no cabo: a resposta do tiro já viajava
Cliente e servidor preparam e aplicam o comando com o mesmo código, e o formato do cabo não muda um byte
Codificar um snapshot já não pode derrubar o servidor: a função devolve um opcional, e o laço conta a rejeição, a nomeia e pula esse snapshot
Até o feixe aparecer passa uma viagem de ida e volta, 30–60 ms. O imediato —clarão, recuo e som— continua imediato, mas isso é validado por uma pessoa jogando
Banco três vistas do mesmo instante, parado e correndo, mais uma partida conectada de 900 quadros e seis contratos novos
Testado e descartado
Desenhar o feixe no cliente no momento do cliqueErrava 10 cm parado e 8,94 m correndo em relação à bala que o servidor resolvia. Um feixe que não coincide com o tiro ensina a mirar errado.
Manter a ordem antiga de preparação do comando por compatibilidadeO teste novo mediu 283 desacordos sobre 300 entre o que o cliente desenhava e o que o servidor aplicava. Com o código compartilhado: 0.
EvidênciasTiro em rede · continua faltando o critério mais antigo dessa fase: uma partida entre duas pessoas em duas máquinas diferentes, atirando em rede
· F5 · ADR 0083, 0090 «Cinta»: três alturas de cobertura e uma boca de serviço por sítio
O mapa competitivo são duas arenas unidas por três caminhos, compacto. Conviviam cinco alturas de cobertura baixa; agora há três e nenhuma outra, 1,00 / 1,60 / 2,20 m, com a faixa de 1,20 a 1,50 m proibida porque corta a caixa de impacto justo onde o olho não a julga. E a defesa tem duas bocas por sítio: acrescentou-se uma boca de serviço com dintel a 2,40 m, quatro metros ao sul da que já tinha.
1.328 brushes, 0 faces em conflito e pegada jogável de 84 × 62 m
18 % de piso elevado, com a banda do banco em 15–25 %; 14 % coberto; e 0 % de piso aberto longe de qualquer parede, que antes era 1 %
Oito pilares de 1,60 m novos, e a cobertura baixa unificada em 1,00 m exatos
Tempos medidos com a grade do SDK: defesa ao sítio 6,5 s, ataque 12,3 s, rotação entre sítios 12,8 s e spawn a spawn 12 s
Falta que o fundador o percorra e o jogue
Reta de tiro mais longa, contra o máximo do contrato36,2 m / 40,0
Testado e descartado
A linha de rifle de 40 a 45 m que o banco de referência pedeNão cabe em 84 × 62 m: a reta mais longa que a geometria dá é 36,2 m, e correr o gerador de novo não moveu o máximo nem um metro. Conseguir 45 m obrigaria a abrir o mapa, então se diz em vez de estimar.
Abrir uma entrada nova atravessando o mapaUma tentativa automática deixou uma reta de 79,7 m, o dobro do máximo do contrato, e faces em conflito. A verificação pegou isso na primeira tentativa, com três testes do mapa em vermelho, e foi revertido: uma entrada nova se abre com um cotovelo ou uma porta.
EvidênciasStatus do projeto · o critério de encerramento dessa fase é o orçamento de desempenho, e hoje não se cumpre: está na entrada abaixo
Entradas anteriores
Data
O que mudou
Número
Fase
O corte por câmera fecha parte do buraco, e o orçamento continua sem entrar
média 9,6097 → 9,3372 ms contra um objetivo de 8,3333: ainda 12,0 % acima
F5
Banda competitiva de combate, e escadas que não dão saltos
armadura do rifle 0,5 → 0,75; salto do olho por tick 15 → 5 cm
F5
Partida por rodadas com placar, e o mapa de testes deixa de ser uma arena
primeiro a 13, metades de 12, rodada de 1:55; piso aberto 35 % → 1 %