BotStrikes

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.

· 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.

· 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.

· 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 %.

· 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.

· 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.

· 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.

· 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.

Entradas anteriores

DataO que mudouNúmeroFase
O corte por câmera fecha parte do buraco, e o orçamento continua sem entrarmédia 9,6097 → 9,3372 ms contra um objetivo de 8,3333: ainda 12,0 % acimaF5
Banda competitiva de combate, e escadas que não dão saltosarmadura do rifle 0,5 → 0,75; salto do olho por tick 15 → 5 cmF5
Partida por rodadas com placar, e o mapa de testes deixa de ser uma arenaprimeiro a 13, metades de 12, rodada de 1:55; piso aberto 35 % → 1 %F6