Any3DAny3D
·Any3D Team

Pourquoi les modèles 3D sont-ils si lourds ?

3d-compressiongltfwebglperformance

Votre modèle grossit en secret

Vous avez exporté un fichier GLB, 10 Mo, ça semble correct. Vous l'ouvrez sur votre téléphone : écran blanc, saccades, voire un plantage pur et simple.

Aucun problème sur ordinateur, mais ça explose sur téléphone. Ce n'est pas la faute du code. C'est une propriété contre-intuitive des modèles 3D : sur le disque et en VRAM, la taille est complètement différente.

Une image JPG sur le disque peut ne faire que 200 Ko. Mais le GPU ne comprend pas le JPG ; il ne comprend que les pixels bruts. Donc, avant d'être chargée en VRAM, l'image est entièrement décompressée. Une texture 2048x2048 consomme environ 22 Mo de VRAM une fois décompressée. Si vous utilisez 6 textures (albedo, normal, roughness, metallic, AO, emissive), un seul matériau coûte 132 Mo.

Un téléphone n'a peut-être au total que 2-4 Go de VRAM, et les textures d'un seul modèle en consomment 3-6 %. Et s'il y a 10 modèles dans la scène ?

Ouvrons-le : où vont les octets

Un modèle GLB typique comporte trois parties principales : les données de sommets, les textures, et les métadonnées plus les animations.

Prenons un vrai modèle PBR :

ComposantCe que c'estPart typiqueRemarque
Texturesalbedo, normal, roughness, metallic, AO, etc.70-85 %Presque toujours le gros
Données de sommetsposition, normal, UV, tangent, color10-20 %Dépend de la complexité
Données d'animationsquelettes, skinning, images clés0-15 %Seulement si animé
Autredéfinitions de matériaux, structure de scène, caméras< 2 %Négligeable

Les textures représentent environ 80 %. Souvent, on pense que ce sont les sommets qu'il faut optimiser, mais ce qui prend vraiment de la place, ce sont les textures.

« Petit sur le disque » ne veut pas dire « petit en VRAM »

C'est peut-être le point le plus important pour comprendre la performance 3D.

Le PNG et le JPG sont conçus pour le transfert réseau——petits sur le disque, téléchargement rapide. Mais le GPU ne peut pas les utiliser directement ; ils doivent d'abord être entièrement décompressés en pixels bruts. La formule :

VRAM = largeur * hauteur * 4 octets (RGBA) * 1.333 (avec mipmaps)

Une texture RGBA 4096x4096 :

IndicateurValeur
Taille du fichier PNG~8 Mo
Taille du fichier JPG~1.5 Mo
Utilisation VRAM (avec mipmaps)~87 Mo

Un JPG de 1.5 Mo devient 87 Mo en VRAM.

Qu'est-ce que les mipmaps ? Le GPU génère une série de versions de plus en plus petites d'une texture, de la taille d'origine jusqu'à 1x1 pixel, chaque niveau faisant la moitié du précédent. Cela rend les objets éloignés plus rapides et plus nets à afficher, mais coûte environ 33 % de VRAM en plus. Presque toutes les applications 3D utilisent les mipmaps, donc ce surcoût est essentiellement standard.

Le PNG et le JPG sont donc comme des sacs de rangement sous vide——compressés et petits pour le voyage, mais vous devez tout déplier à destination. Le téléchargement est plus rapide, mais l'économie de VRAM est nulle.

Que se passe-t-il quand la VRAM s'épuise

Vous n'aurez pas de jolie boîte de dialogue « mémoire insuffisante ». La réalité est pire :

  • Mobile : écran blanc, ou le système ferme carrément l'onglet
  • Casques VR : chutes de frame. En VR, une image perdue n'est pas « un peu de lag »——elle provoque des nausées
  • Desktop : clignotement des textures, dégradation, ralentissement du rendu

Sur Reddit, un développeur a construit une galerie WebXR et a entassé 60 images stéréoscopiques sur un Quest. Au début, ça marchait, puis c'est devenu de plus en plus instable jusqu'au plantage. Il a passé des jours à déboguer son code avant de réaliser qu'il n'avait jamais sérieusement réfléchi à la VRAM——il n'avait fait qu'envoyer des JPG au GPU en continu.

Deux voies pour la compression

La compression des modèles 3D se divise en deux directions :

Compression des sommets——stocke les données géométriques (coordonnées des sommets, normales, UV) de manière plus compacte. Par exemple, remplacer des flottants 32 bits par des entiers 16 bits (c'est ce qu'on appelle la quantification). Solutions représentatives : Draco, MeshOpt, KHR_mesh_quantization.

Compression des textures——garde les textures compressées même dans la VRAM. Le GPU décode les pixels individuels à la volée lors de l'échantillonnage, presque sans coût de performance. Solution représentative : KTX2 + Basis Universal.

Compression des sommetsCompression des textures
Ce qu'elle réduitDonnées géométriquesTextures
Effet typique50-90 % plus petit50-70 % plus petit sur le disque, 75 % de VRAM en moins
Avec perte ?Oui, perte de précisionOui, perte de qualité
Idéal pourModèles denses en sommetsPresque tous les modèles PBR
VoirPartie 2Parties 3 et 4

Un malentendu courant : compresser les sommets avec Draco et c'est plié. Mais les textures représentent 80 % de la taille du modèle——divisez les sommets par deux et le tout ne rétrécira peut-être que de 10 %. Il faut travailler sur les deux fronts.

Aucune méthode ne gagne partout

C'est la thèse centrale de toute la série :

Des plateformes, des appareils et des usages différents appellent des stratégies de compression différentes.

ScénarioGoulet d'étranglement principalPriorité
Vitrine web desktopVitesse de téléchargementTaille du fichier
Navigateur mobileVRAMCompression des textures
Casque VRVRAM + framerateCompression des textures + simplification des sommets
WeChat Mini ProgramTaille du paquet + compatibilitéOptions légères (MeshOpt)
Grandes scènesVRAM + draw callsCompression complète + LOD

Chaque prochain article ne dira pas simplement « utilisez X et c'est fini ». Il expliquera : où X brille, quand il se retourne contre vous, et quand vous devriez plutôt utiliser Y.

Prochaines étapes

Cet article a cerné le problème. Le prochain passe à la pratique——à la rencontre des trois outils de la compression des sommets : quantification, MeshOpt et Draco.

Nous soutenir