Piattaforme diverse, destini diversi: guida alla scelta dello schema di compressione
I primi 4 articoli hanno trattato gli strumenti per la compressione dei vertici e delle texture. Ma saper usare gli strumenti è una cosa, quale usare e in quale scenario è un'altra. Questo articolo risponde proprio a questa domanda — e cerca di darti una risposta definitiva che puoi applicare subito.
Dopo aver letto questo articolo dovresti saper rispondere: su quale piattaforma gira il mio progetto, il collo di bottiglia iniziale è il download o la memoria GPU, e quale schema adottare per texture e vertici.
Premessa: guidato dallo scenario, non dagli strumenti
C'è un solo principio fondamentale in questo articolo, ribadito più volte in questa serie:
Non esiste uno schema di compressione "migliore", solo quello "più adatto allo scenario".
Tre variabili che influenzano la scelta:
- Piattaforma/dispositivo: PC desktop, browser mobile, visori VR, mini-program — capacità enormemente diverse
- Modalità d'uso: visualizzazione una tantum (pagina prodotto e-commerce) o immersione prolungata (gioco VR)
- Collo di bottiglia principale: download lento, memoria GPU insufficiente, o decodifica che blocca il primo rendering
Prima chiarisci il collo di bottiglia, poi scegli lo strumento. La matrice qui sotto cristallizza questo ragionamento.
Matrice decisionale principale: piattaforma × schema consigliato
Questa è la tabella più importante dell'articolo. Suddivisa per piattaforma, con schemi consigliati per texture e vertici, e relative motivazioni.
| Piattaforma / Scenario | Schema texture | Schema vertici | Collo di bottiglia principale | Motivazione chiave |
|---|---|---|---|---|
| Web desktop (browser PC) | KTX2 o WebP | MeshOpt / quantizzazione | Velocità download | Memoria GPU abbondante, priorità a file piccoli e caricamento rapido |
| Web mobile (browser smartphone) | KTX2 (obbligatorio) | MeshOpt | Memoria GPU | Memoria GPU limitata, texture devono essere compresse a blocchi |
| WebXR / visori VR | KTX2 (obbligatorio) | MeshOpt + LOD | Memoria GPU + frame rate | Memoria GPU piena = crash, frame drop = nausea |
| Mini-program (WeChat) | KTX2 / WebP | MeshOpt / solo quantizzazione | Dimensione pacchetto + compatibilità | Limiti sul pacchetto, evitare decoder pesanti |
| Showcase e-commerce | WebP (leggero) / KTX2 (preciso) | MeshOpt | Velocità primo rendering | Richiesta apertura immediata, volume sacrificato per velocità |
| Scena di grandi dimensioni / Digital Twin | KTX2 (obbligatorio) | MeshOpt + Draco + LOD | Memoria GPU + draw call | Molte texture, modelli grandi, compressione a tutto campo |
Alcune considerazioni da ricordare:
- Se la memoria GPU è il collo di bottiglia, KTX2 è obbligatorio (mobile, VR, scene grandi)
- Se il download è il collo di bottiglia e la memoria GPU è abbondante, WebP basta (desktop, e-commerce)
- In ambienti sensibili alla dimensione del pacchetto come i mini-program, preferisci MeshOpt a Draco — decoder piccolo, buona compatibilità
- Draco va considerato solo per modelli molto grandi, per la maggior parte dei modelli medi e piccoli MeshOpt è più equilibrato
Confronto completo dei formati texture
Sapere "usa KTX2" non basta. Vediamo tutti i formati texture su tutte le dimensioni:
| Formato | Dimensione file | Occupazione memoria GPU | Velocità upload | Compatibilità | Qualità immagine | Scenari adatti |
|---|---|---|---|---|---|---|
| PNG | Grande | Grande (dopo decompressione) | Lenta | Molto ampia | Lossless | Valori numerici precisi/trasparenza, o piattaforme legacy |
| JPG | Molto piccola | Grande (dopo decompressione) | Lenta | Molto ampia | Lossy | Texture colore, priorità alla trasmissione |
| WebP | Molto piccola | Grande (dopo decompressione) | Lenta | Abbastanza ampia | Alta | Web desktop, priorità alla velocità di download |
| AVIF | Ancora più piccola | Grande (dopo decompressione) | Lenta | In diffusione | Alta | Piattaforme nuove, compressione estrema |
| KTX2 (ETC1S) | Piccola | Molto piccola | Veloce | Richiede transcodifica | Media (colori sufficienti) | Texture colore, mobile/VR |
| KTX2 (UASTC) | Media | Piccola | Veloce | Richiede transcodifica | Alta | Normal map / texture dati |
Nota: le prime tre righe (PNG/JPG/WebP/AVIF) hanno tutte occupazione memoria GPU "Grande" — non importa quanto sia piccolo il file su disco, una volta in GPU viene decompresso ai pixel originali. Questo è il limite fondamentale dei formati tradizionali.
Strategia ibrida molto comune: le texture colore chiave usano KTX2 per garantire la memoria GPU, le texture secondarie (es. una piccola emissive) usano WebP per semplicità. Non serve uniformare tutto a KTX2: distribuisci in base al collo di bottiglia.
Diagramma di flusso decisionale: scegli passo dopo passo
La matrice è il risultato, il diagramma ti mostra come arrivarci.
Su quale piattaforma gira il tuo progetto?
│
├─ Web desktop (memoria GPU abbondante)
│ └─ Il primo rendering è lento?
│ ├─ Sì → WebP (o AVIF) + MeshOpt [priorità alla velocità di download]
│ └─ No, ma molti modelli → KTX2 + MeshOpt [margine per il futuro]
│
├─ Web mobile / VR / scene grandi (memoria GPU limitata)
│ └─ Texture: KTX2 obbligatorio (colori ETC1S, dati UASTC)
│ └─ I vertici del modello sono molto densi?
│ ├─ Sì → + Draco [compressione estrema, accettabile decodifica lenta]
│ └─ No → + MeshOpt [equilibrato]
│
└─ Mini-program / runtime limitato
└─ Sensibile alla dimensione del pacchetto?
├─ Sì → solo quantizzazione o MeshOpt + WebP [zero/piccolo decoder]
└─ Abbastanza → MeshOpt + KTX2 [combinazione standard]
Compressione vertici vs texture: dove investire
Spesso chiedono: budget limitato, da dove comincio? Dipende dalla composizione del modello:
| Caratteristiche del modello | Priorità di investimento | Motivazione |
|---|---|---|
| Personaggio/prodotto PBR (molte texture) | Compressione texture | Le texture occupano 80%+, investire sui vertici ha poco ritorno |
| Modello CAD/scansione (vertici densi, poche texture) | Compressione vertici | I vertici sono il volume principale |
| Personaggio animato (scheletro + skin) | Entrambi, ma vertici prima di Draco | Anche i dati di animazione occupano volume, Draco supporta male le animazioni |
| Architettura/scena (grande, texture medie) | Texture + LOD | Le texture risparmiano memoria GPU, LOD risparmia draw call |
Una classifica approssimativa del ritorno: texture KTX2 > vertici MeshOpt/quantizzazione > semplificazione geometrica (LOD) > vertici Draco. Inizia da ciò che dà più beneficio.
Strategia ibrida: texture chiave in KTX2, secondarie in WebP
Non tutte le texture meritano di essere compresse in KTX2. Un tipico materiale PBR ha 5-6 texture: comprimerle tutte in KTX2 è un lavoro notevole, e a volte non necessario.
Divisione pratica:
- KTX2 obbligatorio: albedo (grande, colore), normal (sensibile alla precisione), roughness/metallic (influenzano l'illuminazione)
- WebP/JPG accettabile: emissive (di solito piccola), AO (medio-bassa frequenza), normal di dettaglio (se presente)
Criterio: la texture è grande? Ha dettagli ad alta frequenza? Verrà campionata frequentemente? Se sì a tutte e tre → KTX2; se no a tutte → formato tradizionale per semplicità.
Automazione della scelta: gltf-transform in un colpo solo
Il comando optimize di gltf-transform è la soluzione universale per la maggior parte degli scenari — rileva automaticamente il tipo di texture, comprime secondo la strategia consigliata, e gestisce opzionalmente i vertici.
# Installazione
npm install -g @gltf-transform/cli
# Ottimizzazione standard: texture KTX2 + vertici MeshOpt + rimozione ridondanze
gltf-transform optimize model.glb model-optimized.glb \
--texture-compress basisu \
--meshopt
Parametri:
| Parametro | Effetto | Default |
|---|---|---|
--texture-compress basisu | Comprime le texture in KTX2 (sceglie automaticamente ETC1S/UASTC) | Off |
--meshopt | Abilita compressione MeshOpt sui vertici | Off |
--simplify | Semplificazione geometrica (riduce i vertici, lossy) | Off |
--weld | Unisce i vertici duplicati | On |
--prune | Rimuove nodi/materiali inutilizzati | On |
Una combinazione "compressione forte" adatta al mobile:
gltf-transform optimize model.glb model-mobile.glb \
--texture-compress basisu \
--meshopt \
--simplify --simplify-ratio 0.5 \
--prune --weld
Combinazione "morbida" per desktop (mantiene i dettagli, comprime solo texture e vertici):
gltf-transform optimize model.glb model-desktop.glb \
--texture-compress webp \
--meshopt
Non vuoi scrivere script? Usa la compressione online di Any3D
Non vuoi installare Node o configurare una toolchain? Compressione online Any3D elabora direttamente nel browser — scegli un GLB, regola i parametri visivamente in base alla piattaforma (mobile/desktop/VR), il modello non viene caricato su server (elaborazione interamente locale), e esporta la versione compressa con un clic. Alla base usa lo stesso motore di gltf-transform, ma senza alcuna curva di apprendimento. Il prossimo articolo sulla pipeline end-to-end collegherà l'intero flusso.
Promemoria in una frase
- Memoria GPU è il collo di bottiglia → KTX2, non c'è alternativa
- Download è il collo di bottiglia, memoria GPU abbondante → WebP/AVIF va bene
- Sensibilità alla dimensione del decoder → MeshOpt > solo quantizzazione > Draco
- Modelli molto grandi → solo allora considera Draco
- Nel dubbio →
gltf-transform optimizein un colpo, se sbagli aggiusta
Prossimi passi
Il framework di scelta è pronto. Ultimo articolo della serie: partendo da un modello reale, percorreremo l'intero flusso — esportazione da Blender, compressione texture, compressione vertici, caricamento nel motore — con script automatici completi e una tabella riassuntiva della serie.