perf(anims): compressão meshopt dos clipes — 35,6 MB viram 13,9 MB - #413
perf(anims): compressão meshopt dos clipes — 35,6 MB viram 13,9 MB#413rubenmarcus wants to merge 5 commits into
Conversation
MEDIDO: `models/anims` é a maior pasta de modelo do jogo (570 arquivos, 35,6 MB) e era a única sem otimizador nenhum. Não há malha skinned aqui — 27,5 dos 35,6 MB são keyframe puro — então o veto do optimize-tribos a quantizar malha não se aplica; o que se aplica é MEDIR o desvio. Pré-requisito que quase passou batido: o jogo usava `new GLTFLoader()` SEM decodificador. GLB com EXT_meshopt_compression simplesmente não abriria — e o catch por arquivo faria isso sumir calado em boneco procedural. O decoder (28 KB) vai vendorizado e registrado nos três carregadores (glbchars, weapons, fparms), e o tools/merge-anims.mjs também precisou dele. DESVIO MEDIDO, com a unidade certa: o rig do Mixamo é autorado em CENTÍMETROS e o `Armature` tem escala 0,01 — medir o canal cru e chamar de mm infla por 100 (minha 1ª leitura deu "42 mm" quando o desvio real é 0,42 mm). Régua AD converte pela escala do Armature: translação 0,420 mm (teto 2) · rotação 0,829° (teto 1,5) Conferido rodando: o boneco continua animando no navegador (osso deslocou 2,9 m em 1,5 s), anims:check e anims:merge:check verdes, check:fast 58/58. Mutante `teto-frouxo` acende as duas cláusulas. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com> Agent: Claude Code
Rodado `npm run anims:otimiza`. 35,6 -> 13,9 MB. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Commit-grande: 570 GLBs de clipe reescritos pelo optimize-anims — binário, sem como dividir Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com> Agent: Claude Code
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com> Agent: Claude Code
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com> Agent: Claude Code
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
csbrasil-bot classificationNote @rubenmarcus abriu 590 arquivo(s) · +43 −32, base main. O que mudou
Labels
|
estraga-codigo
left a comment
There was a problem hiding this comment.
Palhaço Mal · revisor da casa · 🤡
mapa da mudança
- assets (570):
adjim.glb,crouch.glb,crouchwalk.glb,death.glb… - docs (11):
ARCH.generated.md,README.md,STATUS.md,arquitetura.md… - arnês (4):
ARCH.md,anims-desvio-check.mjs,merge-anims.mjs,optimize-anims.mjs - jogo (3):
fparms.js,glbchars.js,weapons.js - outros (2):
package.json,meshopt_decoder.module.js
Tip
Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓
limpo pelos critérios das minhas ações desta rodada
Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.
impacto cruzado
graph RL
game_js["game.js"] --> fparms_js["fparms.js"]
main_js["main.js"] --> fparms_js["fparms.js"]
fparms_js["fparms.js"] --> glbchars_js["glbchars.js"]
game_js["game.js"] --> glbchars_js["glbchars.js"]
loading3d_js["loading3d.js"] --> glbchars_js["glbchars.js"]
fparms_js["fparms.js"] --> weapons_js["weapons.js"]
game_js["game.js"] --> weapons_js["weapons.js"]
glbchars_js["glbchars.js"] --> weapons_js["weapons.js"]
(grafo local de public/js, uma rodada atrás do head do PR.)
— maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡
Dos 13 arquivos em conflito, 12 eram gerados e vieram da main, re-derivados depois. O único de verdade era o package.json, resolvido por união: `eval:mutcega` que a main ganhou no #416 mais `eval:animsdesvio` deste PR. E o #416, que acabou de entrar, mordeu este PR na porta: o `anims-desvio-check.mjs` nasceu com o mesmo defeito das outras cinco réguas - anunciava "portão cego" e saía por `falhas.length`, que ali é zero por definição, então a prova de que a régua morde sairia VERDE justo quando ela não mordesse. Aplicado o padrão da casa: o caso entra na lista de falhas. Nenhum arquivo de animação, de código ou de asset foi tocado. Agent: Claude Opus 5 (Claude Code) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
estraga-codigo
left a comment
There was a problem hiding this comment.
Palhaço Mal · revisor da casa · 🤡
mapa da mudança
- assets (570):
adjim.glb,crouch.glb,crouchwalk.glb,death.glb… - docs (11):
ARCH.generated.md,README.md,STATUS.md,arquitetura.md… - arnês (4):
ARCH.md,anims-desvio-check.mjs,merge-anims.mjs,optimize-anims.mjs - jogo (3):
fparms.js,glbchars.js,weapons.js - outros (2):
package.json,meshopt_decoder.module.js
Tip
Risco BAIXO · nota 10/10 ▓▓▓▓▓▓▓▓▓▓
nada aqui que quebre amanhã. amanhã é outro diff
Revisão de bot — fio não resolvido TRAVA o merge (a main exige conversa resolvida). Resolve ou refuta.
impacto cruzado
graph RL
game_js["game.js"] --> fparms_js["fparms.js"]
main_js["main.js"] --> fparms_js["fparms.js"]
fparms_js["fparms.js"] --> glbchars_js["glbchars.js"]
game_js["game.js"] --> glbchars_js["glbchars.js"]
loading3d_js["loading3d.js"] --> glbchars_js["glbchars.js"]
fparms_js["fparms.js"] --> weapons_js["weapons.js"]
game_js["game.js"] --> weapons_js["weapons.js"]
glbchars_js["glbchars.js"] --> weapons_js["weapons.js"]
(grafo local de public/js, uma rodada atrás do head do PR.)
— maquiagem de verde por cima de vermelho eu desenmascaro no primeiro golpe de vista 🤡
|
Esbirro · plantão da produção · 🕵️ check vermelho parado neste PRCaution Não sei classificar este vermelho. Segue o que o CI cuspiu — palpite de bot sobre bug alheio só atrapalha.
Vermelho: Rabo do log: — nada fora do normal no meu turno 🕵️ |
Dos 10 arquivos em conflito, 9 eram gerados e vieram da main, re-derivados depois. O package.json não trazia régua nova deste PR, então ficou o da main. O #416 mordeu na porta, como no #413: o `vram-check.mjs` nasceu com o mesmo defeito - anunciava "portão cego" e saía por `falhas.length`, que ali é zero por definição. Aplicado o padrão da casa: o caso entra na lista de falhas. Nenhum arquivo de textura ou de código foi tocado. Agent: Claude Opus 5 (Claude Code) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com>
O dono viu deslizamento em partida — e a régua aprovou por pouco
Conferi a fiação primeiro, e ela está certa: o decodificador está vendorizado e commitado ( O problema é o teto da AD2. Medido nesta branch: 1,192° consome 79% do teto de 1,5°. Um grau e dois décimos por keyframe, em cada osso, acumulado ao longo da cadeia quadril → coxa → joelho → pé, é exatamente o que produz deslizamento: o pé deixa de casar com o chão. E o jogo depende disso — A régua não está errada em existir; o limiar é que foi escolhido frouxo demais. Ela mede a coisa certa e passou num desvio que o olho reprova em partida — que é a definição de régua que não morde. O que eu fariaDuas saídas, e a escolha é do dono:
Em qualquer um dos dois, o teto de 1,5° não pode ficar: ele já provou que aprova o que quebra. (Os conflitos deste PR eu resolvi antes de investigar — 12 de 13 eram arquivo gerado.) 🤖 Generated with Claude Code |
|
Fechando. O dono jogou e reprovou, e a falha é minha — em dois lugares. 1. O teto da AD2 não tinha procedência. Escolhi 1,5° porque parecia pouco. Isso é exatamente o defeito que eu apontei no #365 há algumas horas ("teto sem procedência é opinião") e cometi no meu próprio PR. Medido agora: 1,193°, ou 79% do teto — a régua aprovou o que o olho reprova em partida, que é a definição de régua que não morde. 2. A amostra escondeu o número. A AD media 3 arquivos, e o cabeçalho dela dizia que "o desvio é propriedade do encoder, não de um arquivo em particular". Essa premissa está errada: varrendo 80 arquivos, o pior é Some-se a isso que o O ganho era real (35,6 → 13,9 MB, -61%), mas não ao custo de o boneco deslizar. Sem compressão, como o dono pediu. Se um dia isso voltar, a régua certa não é desvio de keyframe — é a sugestão da sessão Obrigado à |
Nasce de duas reprovações minhas. O #413 media desvio angular quando o que quebrou era contato de pé; o #417 media VRAM quando o que quebrou era tempo de tela. VRAM e bytes são baratos de medir e por isso sedutores; o que o jogador sente é o relógio. TETO COM PROCEDÊNCIA — a lição que faltou nas duas: a medição varia sozinha ±8% (4 corridas na main: 6083, 6607, 6854, 7086 ms). O teto de 9300 ms é ~1,4× a mediana, cinco vezes o ruído observado e bem abaixo dos 12557 ms que o KTX2 no elenco produziu. Passa ruído, morde regressão. Mutante `lento` estrangula a CPU em 4× e acende a cláusula (10.449 ms). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: rubenmarcus <rubenmarcus.dev@gmail.com> Agent: Claude Code
Summary
models/anims(570 arquivos, 35,6 MB) era a maior pasta de modelo do jogo e a única sem otimizador; ganhou um (optimize-anims.mjs);eval:animsdesvionocheck:fast, com a conversão de unidade que quase me enganou.Evidência
models/animsNão há malha skinned aqui (27,5 dos 35,6 MB são keyframe puro), então o veto do
optimize-tribosa quantizar malha não se aplica. O que se aplica é medir o desvio.O pré-requisito que quase passou batido
O jogo usava
new GLTFLoader()sem decodificador nenhum. GLB comEXT_meshopt_compressionsimplesmente não abriria — e ocatchpor arquivo faria isso sumir calado, virando boneco procedural. O decoder vai vendorizado e registrado emglbchars,weaponsefparms; otools/merge-anims.mjstambém precisou dele (estourava comMissing required extension).Desvio medido — e a armadilha de unidade
O rig do Mixamo é autorado em centímetros, e o nó
Armaturecarrega escala 0,01. Medir o canal cru e chamar de milímetro infla o número por 100: minha primeira leitura deu "42 mm" quando o desvio real é 0,42 mm. A régua AD converte pela escala do Armature, que é o que o jogo aplica.Os 0,83° de rotação são o número a observar: num antebraço de 30 cm dão ~4 mm na mão. Em terceira pessoa é invisível; na primeira pessoa o IK de mão (
poseToWeapon) reencosta a mão na arma todo quadro.Validation
npm run check:fast— 58/58anims:checkeanims:merge:checkverdesteto-frouxoacende AD1 e AD2Risk