Obiettivi della lezione
Un sito 3D che gira bene sul portatile di chi l'ha fatto non vuol dire niente: quello è il dispositivo migliore che toccherà mai quella pagina. Questa lezione serve a misurare sul serio e a mettere online una cosa che regge anche fuori dal tuo studio.
Finita questa lezione, e con lei il corso, sai:
- Leggere i tre numeri che contano: fotogrammi, chiamate di disegno, peso scaricato;
- Alleggerire un modello e delle texture senza rifarli;
- Caricare la scena in ritardo, così non entra nel primo disegno della pagina;
- Servire chi non può o non vuole vedere il 3D;
- Passare la checklist prima di pubblicare.
I tre numeri
I fotogrammi al secondo. Si guardano nel pannello delle prestazioni del browser, mentre si scorre. Il bersaglio è 60 stabile: più dei numeri conta la regolarità, perché un 60 che ogni tanto cade a 30 si sente peggio di un 40 costante.
Le chiamate di disegno. Three.js te le dice da solo, e sono il numero che spiega quasi tutti i rallentamenti.
console.log(renderer.info.render.calls); // chiamate per fotogramma
console.log(renderer.info.render.triangles); // triangoli disegnati
console.log(renderer.info.memory.geometries, renderer.info.memory.textures);
Un ordine di grandezza per orientarsi: sotto le 100 chiamate stai tranquillo, fra 100 e 300 sei nella norma di una scena ricca, sopra le 500 su un telefono comincia a sentirsi. E il numero scende unendo oggetti che condividono lo stesso materiale, perché una chiamata disegna un materiale per volta.
Il peso scaricato. Scheda Rete, cache vuota, e si guarda il totale. Per una pagina con un oggetto, sotto i 2 MB è un buon posto dove stare; sopra i 5 si comincia a perdere gente prima ancora che la scena compaia.
Alleggerire quello che pesa
Il peso sta in due posti soli, e il codice non è nessuno dei due.
Il modello
Il formato per il web è glTF, nella sua forma compatta .glb. Se ti arriva un OBJ, un FBX o roba da CAD, la prima cosa da fare è convertirlo. Poi ci sono due compressioni che si sommano: Draco per i vertici e meshopt, che stringono un modello di parecchie volte senza che si veda la differenza. Si applicano con gli strumenti a riga di comando dell'ecosistema glTF, e in Three si caricano attivando il decodificatore corrispondente.
La cosa che rende di più, però, viene prima: guardare quanti triangoli ha il modello. Un oggetto che in pagina sarà grande 500 pixel non ha bisogno di 900.000 triangoli, e quel numero nei modelli che arrivano dai reparti tecnici è la regola.
Le texture
Un JPG da 2048 pesa poco da scaricare e tanto in memoria, perché sulla scheda grafica sta decompresso. Il formato giusto è KTX2 con compressione Basis, che resta compresso anche nella GPU e taglia la memoria di parecchie volte. Prima ancora: guarda se ti serve quella misura. Su un oggetto piccolo in pagina, 1024 è spesso indistinguibile da 2048 e costa un quarto.
Caricare la scena dopo
Il 3D non deve entrare nel primo disegno della pagina. Se il titolo compare dopo che sono arrivati tre megabyte di modello, hai peggiorato la metrica che Google guarda per prima e hai fatto aspettare una persona per una cosa che voleva vedere dopo.
const osservatore = new IntersectionObserver((voci) => {
for (const v of voci) {
if (!v.isIntersecting) continue;
osservatore.disconnect();
import('./scena.js').then(m => m.avvia()); // il codice arriva adesso
}
}, { rootMargin: '200px' }); // un po' prima di arrivarci
osservatore.observe(document.querySelector('#vista'));
Due guadagni in una volta: la pagina si apre alla velocità di una pagina normale, e chi non scende mai fin lì non scarica niente. Il rootMargin fa partire il caricamento duecento pixel prima, così quando ci arrivi la scena c'è già.
Quello che vede Google
Dentro a un canvas non c'è testo, e nessun motore di ricerca ci trova niente. Se il messaggio della pagina sta solo nella scena, per Google quella pagina è vuota. È il motivo pratico della regola della Lezione 1: il contenuto sta nell'HTML, il 3D è sopra.
Chi resta fuori, e come si serve
- Chi ha chiesto meno movimento. Con
prefers-reduced-motionla scena non si muove: la mostri ferma in una posa buona, oppure metti l'immagine di scorta. Il contenuto resta identico. - Chi non ha WebGL. Il controllo della Lezione 6, e dietro al canvas un'immagine vera con il suo
alt. - Chi naviga da tastiera o con un lettore di schermo. Un canvas non è raggiungibile e non dice niente: se dentro c'è qualcosa di interattivo, quella funzione deve esistere anche fuori, come pulsante o come elenco.
- Chi ha la batteria al 12%. Il disegno a richiesta della Lezione 6, più la pausa quando il canvas esce dallo schermo.
Sono quattro casi che capitano ogni giorno sullo stesso sito, e tutti e quattro si servono con del codice che hai già scritto nelle lezioni precedenti.
La checklist prima di pubblicare
- La pagina si legge tutta con JavaScript disattivato
- Con WebGL spento resta un'immagine sensata, non un buco
- Con «riduci animazioni» acceso non si muove niente e si capisce tutto
- Il peso totale a cache vuota sta sotto la soglia che ti sei dato
- La scena si carica dopo, e non entra nel primo disegno
- Da ferma la pagina non ridisegna
-
setPixelRatioè limitato - Provata su un telefono vero, non solo nel simulatore del browser
- Le chiamate di disegno sono un numero che conosci
- I
markersdi ScrollTrigger sono spenti
La prova che non si può saltare
Il simulatore del browser cambia la misura dello schermo e lascia la tua scheda grafica. Un telefono vero ha un decimo di quella potenza e si scalda. Prendine uno vecchio, mettilo sulla rete locale e apri la pagina: dieci minuti che valgono una settimana di correzioni fatte a indovinare.
Laboratorio: misura e metti online
Obiettivo: il tuo progetto misurato, alleggerito e passato per la checklist.
Consegna
- Prendi i tre numeri di partenza: fotogrammi mentre scorri,
renderer.info.render.calls, peso totale a cache vuota. Scrivili. - Guarda i triangoli del tuo modello e decidi se sono troppi per la misura che ha in pagina.
- Alleggerisci: converti in
.glb, prova una compressione, e dimezza la misura delle texture. Riprendi i tre numeri. - Sposta il caricamento dentro a un
IntersectionObservere guarda il tempo del primo disegno prima e dopo. - Passa la checklist voce per voce, comprese le tre prove spegnendo cose.
- Apri la pagina su un telefono vero e guarda i fotogrammi e la temperatura dopo due minuti.
- Scrivi il verdetto in tre righe: che cosa hai guadagnato, che cosa resta da fare, e se il 3D vale ancora il suo prezzo.
Risultato atteso
Due terne di numeri, prima e dopo, la checklist passata e tre righe di verdetto. Ed è legittimo che il verdetto sia «non vale il prezzo»: ci sei arrivato misurando e non a naso, e questa è esattamente la competenza che nella Lezione 1 stavamo cercando.
Mini-test finale
Istruzioni
Sezione A: 8 domande a risposta multipla (1 punto), su tutte e sette le lezioni. Sezione B: 2 domande aperte (3 punti). Totale 14. Soglia: 60% (9/14).
Sezione A: risposta multipla
- Il peso di una pagina 3D lo fanno soprattutto:
a) le librerie b) modelli e texture c) il CSS d) gli shader - Il formato dei modelli per il web è:
a) OBJ b) glTF, in forma.glbc) FBX d) STL - KTX2 con Basis serve perché:
a) si scarica prima b) resta compresso anche nella memoria della scheda grafica c) ha più colori d) lo vuole Three.js - Le chiamate di disegno si leggono in:
a)scena.childrenb)renderer.info.render.callsc)camera.infod) console.time - Con
scrubl'ease (Lezione 3):
a) va messooutb) va tolto c) è obbligatorio d) dipende - Un metallo senza ambiente (Lezione 5) appare:
a) bianco b) scuro c) trasparente d) verde - Caricare la scena con
IntersectionObserverserve a:
a) fare le ombre b) non farla entrare nel primo disegno della pagina c) risparmiare triangoli d) supportare i lettori di schermo - Se il messaggio della pagina sta solo dentro al canvas:
a) va bene b) per i motori di ricerca quella pagina è vuota c) serve un sitemap d) si risolve col tone mapping
Sezione B: risposta aperta
- (3 punti) Racconta il tuo progetto dall'inizio: che cosa doveva far capire, quale delle tre cose è diventato, che cosa hai misurato prima e dopo.
- (3 punti) Un cliente vuole la homepage con una scena a schermo intero che parte subito. Scrivi le tre obiezioni che gli faresti e che cosa proporresti al suo posto.
Mostra risposte corrette
Sezione A
- b: modelli e texture.
- b: glTF, nella forma compatta
.glb. - b: resta compresso nella GPU, dove un JPG sta decompresso.
- b:
renderer.info.render.calls. - b: la curva la fa già il dito.
- b: scuro, perché non ha niente da riflettere.
- b: la pagina si apre come una pagina normale.
- b: dentro al canvas non c'è testo.
Sezione B, risposte modello
9. La risposta è personale e vale tre punti se contiene: la frase «deve capire X, il 3D serve perché Y», quale delle tre cose è diventato, e due terne di numeri misurate davvero.
10. Tre obiezioni: la scena a schermo intero che parte subito ritarda il primo disegno e peggiora la metrica su cui Google misura la velocità; chi arriva dal telefono in mobilità paga quei megabyte e sente scaldare; e per i motori di ricerca quella homepage è vuota, perché nel canvas non c'è testo. Proposta: la homepage si apre con il contenuto vero, la scena si carica scendendo con un IntersectionObserver, e dietro resta un'immagine per chi non la vede.
Valutazione (su 14)
- 13-14: ottimo. 9-12: sufficiente. < 9: rivedi i tre numeri e la checklist.
Riassunto del corso
Il mestiere, in sette mosse
- Decidi quale delle tre cose stai facendo, e se il 3D si guadagna il posto.
- Muovi con GSAP, usando
frome le timeline. - Lega il movimento allo scorrimento, e sul telefono impila.
- Monta la scena: canvas, camera, renderer, mesh, giro di disegno.
- Vesti con l'ambiente, i materiali giusti e il tone mapping.
- Attacca la scena al dito, e ridisegna solo quando serve.
- Misura i tre numeri, alleggerisci, e servi chi resta fuori.
Dove continuare
Se vuoi lavorare sul tuo caso con me, porto questi percorsi in azienda e in presenza a Livorno. Se invece ti è piaciuta la parte di codice, il corso Introduzione alla Programmazione è il modo di rendere solide le basi, e nella wiki dei siti web trovi prestazioni, accessibilità e Core Web Vitals spiegati per esteso.
Vuoi farlo con il tuo team?
Questo percorso lo porto dentro le aziende, sui prodotti che avete già : restano vostre le scene e il modo di misurarle.