Kris

Por que os modelos 3D são tão pesados?

Compressão 3DglTFWebGLDesempenho

Seu modelo está engordando escondido

Você exportou um arquivo GLB, 10MB, até que parece ok. Mandou pro celular e abriu — tela branca, lag, ou simplesmente crashou.

No desktop funciona, no celular explode. Isso não é culpa do código, é uma característica nada intuitiva dos modelos 3D: o tamanho no disco e o tamanho na memória da GPU são completamente diferentes.

Uma imagem JPG no disco pode ter só 200KB. Mas a GPU não entende JPG, ela só conhece pixels brutos. Então antes de subir pra VRAM, a imagem é totalmente descomprimida. Uma textura 2048x2048, descomprimida, consome cerca de 22MB de VRAM. Se você usa 6 mapas (albedo, normal, roughness, metallic, AO, emissive), só um material já pesa 132MB.

O celular tem talvez 2-4GB de VRAM no total. As texturas de um modelo já comem 3-6%. E se a cena tiver 10 modelos?

Abrindo o modelo: pra onde vai o peso

Um GLB típico tem três partes principais: dados de vértice, texturas, e metadados/animações.

Pegando um modelo PBR real:

ComponenteO que inclui% típicaDescrição
Texturasalbedo, normal, roughness, metallic, AO, etc.70-85%Quase sempre o vilão
Vérticesposição, normal, UV, tangente, cor10-20%Depende da complexidade
Animaçãoossos, skinning, keyframes0-15%Só se tiver animação
Outrosdefinição de materiais, estrutura da cena, câmera< 2%Desprezível

Texturas respondem por cerca de 80% do peso. Muita gente acha que precisa otimizar vértices, mas o que realmente ocupa espaço são as texturas.

Detalhamento de texturas PBR em modelo 3D

"Disco pequeno" ≠ "VRAM pequena"

Esse é talvez o ponto mais importante pra entender performance 3D.

PNG e JPG foram feitos pra transmissão na rede — pequenos no disco, download rápido. Mas a GPU não pode usá-los diretamente, precisa descomprimir tudo em pixels brutos. A conta é:

VRAM usada = largura * altura * 4 bytes (RGBA) * 1.333 (com mipmap)

Uma textura RGBA de 4096x4096:

MétricaValor
Tamanho do arquivo PNG~8MB
Tamanho do arquivo JPG~1.5MB
VRAM usada (com mipmap)~87MB

Um JPG de 1.5MB vira 87MB na VRAM.

O que é Mipmap? A GPU gera uma série de versões reduzidas da textura, do tamanho original até 1x1 pixel, cada nível com metade do anterior. Isso deixa a renderização de objetos distantes mais rápida e nítida, mas custa cerca de 33% a mais de VRAM. Quase toda aplicação 3D usa mipmap, então esse custo é praticamente padrão.

Ou seja: PNG/JPG são como saco a vácuo de viagem — comprime tudo pra caber na mala, mas ao chegar no destino você precisa estufar tudo de novo. O download é rápido, mas a VRAM não economiza nada.

Comparação entre tamanho em disco e uso de VRAM na GPU

O que acontece quando falta VRAM

Não aparece uma janelinha "memória insuficiente". A realidade é pior:

  • Mobile: tela branca, ou o sistema simplesmente mata a aba do navegador
  • VR headsets: queda de frames. Em VR, drop de frame não é "um pouco lagado", é enjoo na hora
  • Desktop: texturas piscando, degradando, render mais lento

Tinha um dev no Reddit fazendo uma galeria WebXR, enfiou 60 fotos estereoscópicas no Quest. No começo funcionava, depois foi ficando instável até crashar. Ele passou dias caçando bug no código, até perceber que nunca tinha pensado em VRAM — ficou o tempo todo empurrando JPG pra GPU.

Os dois caminhos da compressão

Compressão de modelos 3D tem dois rumos principais:

Compressão de vértices — armazenar coordenadas, normais, UVs e outros dados geométricos de forma mais compacta. Por exemplo, trocar floats de 32 bits por inteiros de 16 bits (isso se chama quantização). Soluções representativas: Draco, MeshOpt, KHR_mesh_quantization.

Compressão de texturas — fazer com que as texturas permaneçam comprimidas também na VRAM. A GPU decodifica pixels individuais em tempo real, quase sem custo de performance. Soluções representativas: KTX2 + Basis Universal.

Compressão de vérticesCompressão de texturas
O que reduzDados geométricosTexturas
Efeito típicoReduz 50-90%Disco -50-70%, VRAM -75%
Com perdas?Sim, perde precisãoSim, perde qualidade visual
Quando usarModelos com muitos vérticesQuase todo modelo PBR
DetalhesParte 2Partes 3 e 4

Um erro comum: achar que comprimir vértices com Draco resolve tudo. Mas se a textura é 80% do peso do modelo, você corta os vértices pela metade e o total emagrece só 10%. Precisa cuidar dos dois lados.

Nenhum método serve pra tudo

Essa é a ideia central da série:

Plataformas, dispositivos e casos de uso diferentes exigem estratégias de compressão diferentes.

CenárioGargalo principalFoco principal
Web no desktopVelocidade de downloadTamanho do arquivo
Navegador mobileVRAMCompressão de texturas
VR headsetVRAM + frame rateCompressão de texturas + simplificação de vértices
Mini-apps (WeChat)Tamanho do pacote + compatibilidadeSoluções leves (MeshOpt)
Cenas grandesVRAM + draw callsCompressão completa + LOD

Cada artigo daqui pra frente não vai só dizer "use X e pronto". Vai explicar: pra que cenário X serve, quando ele atrapalha, e em que caso você deveria usar Y.

Próximo passo

Esse artigo esclareceu o problema. O próximo é mão na massa — conhecer as três ferramentas de compressão de vértices: quantização, MeshOpt e Draco.

Apoie-nos