Sitios cinematográficos|INEMA.CLUB-PRO

Clase 4 · 15 min

Profundidad con Three.js sin trabar la página

Los cuadros de video dan la película; Three.js da una escena dibujada en código, que cambia de ángulo según el scroll. El riesgo es que la escena dibuje sin parar, incluso quieta o fuera de la pantalla, y caliente el celular. Aquí mides, en un Chromium sin pantalla, cuántas veces dibuja la escena en cada situación, y ves fallar el error común.

Comenzar la clase
Monitor sobre una mesa oscura que muestra una escena 3D en alambre con formas geométricas y una cuadrícula en perspectiva.

En esta clase vas a

  1. 1Dibujar bajo demanda: solo cuando el progreso del scroll cambió
  2. 2Tope de densidad (1,5) y pausa fuera de la pantalla con IntersectionObserver
  3. 3Contar los dibujos con Playwright: quieto, haciendo scroll, fuera de la pantalla y reducir movimiento
  4. 4Cuánto pesa Three.js en la página

Objetivo: medir una escena Three.js que solo dibuja cuando el scroll cambia, se detiene fuera de la pantalla y respeta reducir movimiento.

01Cuándo dibuja la escena

Dibujo bajo demanda: cada pregunta es un motivo para NO dibujar. Haz clic en cada etapa.

Haz clic en cada bloque del diagrama para ver qué hace.

El error común es el bucle del tutorial: requestAnimationFrame llamando a render() 60 veces por segundo, para siempre.

02El corazón de la escena del kit

Página kit/site-three/index.html: cuatro anillos a distintas profundidades; la cámara avanza con el scroll. Three.js 0.186.1 (npm, 19/10/2026), copiado en vendor/.

Fragmento · kit/site-three/index.html
      // Bajo demanda: solo dibuja cuando el scroll cambió el progreso y la escena está en pantalla.
      const talvez = () => {
        pedido = false;
        if (!visivel) return;
        const p = progresso();
        if (Math.abs(p - ultimo) < 1e-4) return;
        ultimo = p; desenhar(p);
      };
      const agendar = () => { if (!pedido) { pedido = true; requestAnimationFrame(talvez); } };

03Medir los dibujos

El three-medir.mjs hace scroll en la página en un Chromium sin pantalla y lee window.__renders en cada situación.

Terminal · medir la escena y el peso
K=~/projetos/formacao-cinema-ia-sites-v72/kit
E=${TMPDIR:-/tmp}/ensaio-sites/a4; rm -rf "$E"; mkdir -p "$E"
node "$K/scripts/servir.mjs" "$K/site-three" > "$E/url.txt" & S=$!
until U=$(cat "$E/url.txt") && [ -n "$U" ] && curl -s -o /dev/null "$U"; do sleep 0.3; done
node "$K/scripts/three-medir.mjs" "$U"; echo "saída: $?"
kill $S
python3 "$K/scripts/peso.py" "$K/site-three" | head -1
echo "three.js com gzip -9: $(cat "$K"/site-three/vendor/*.js | gzip -9 | wc -c) bytes"
Terminal · error común: dibujar siempre
K=~/projetos/formacao-cinema-ia-sites-v72/kit
E=${TMPDIR:-/tmp}/ensaio-sites/a4; mkdir -p "$E"
node "$K/scripts/servir.mjs" "$K/site-three" > "$E/url.txt" & S=$!
until U=$(cat "$E/url.txt") && [ -n "$U" ] && curl -s -o /dev/null "$U"; do sleep 0.3; done
node "$K/scripts/three-medir.mjs" "${U}?sempre=1" | grep "^FALHA"; echo "saída: ${PIPESTATUS[0]}"
kill $S
Ejemplo del repositorio
Chromium 156.0.8078.4 (Playwright 1.64.0)
parado 0 · rolando 30 · fora da tela 0 · reduzir 1 · DPR 1,5 (tela com densidade 3)
OK: parado 0 · rolando 30 · fora da tela 0 · reduzir 1 · DPR 1,5
saída: 0
PESO: js 2,12 · html/css 0,00 (MB)
three.js com gzip -9: 415205 bytes

Quieta y fuera de la pantalla: cero. Con reducir movimiento: un cuadro solo. Las dos últimas líneas son el peso: 2,12 MB en bruto (sin minificar), 0,42 MB con gzip -9. Los servidores suelen comprimir JS; el JPEG casi no se comprime. Mide lo que va a viajar por la red antes de compararlo con la película.

04¿Cuadros de video o Three.js?

Los dos caben en la misma página; cada uno hace bien una cosa.

1. Cuadros

Foto real, material, luz difícil: lo que un generador o una cámara hacen mejor que el código.

El peso crece con la duración de la película.

05Práctica

Medir, romper y arreglar.

E1 · Medir

5 min

Ejecuta el bloque "medir la escena y el peso".

Listo cuando: La línea comienza con OK: parado 0 · rolando (el número de dibujos al hacer scroll varía según la máquina), termina con fora da tela 0 · reduzir 1 · DPR 1,5, y viene saída: 0.

E2 · El error

5 min

Ejecuta el mismo medidor con ?sempre=1 al final de la URL (bloque "error común: dibujar siempre").

Listo cuando: Tres líneas FALHA: desenhou … y saída: 1.

E3 · Tu escena

20 min

Copia kit/site-three a una carpeta tuya y cambia los anillos por otra forma (TorusKnotGeometry, por ejemplo) y el color del material. Mantén la función talvez y el techo de densidad. Sirve la carpeta y mide.

Listo cuando: El three-medir.mjs en tu carpeta responde OK: parado 0 … reduzir 1 con saída: 0.

06Prueba de la clase

La explicación aparece después de tu respuesta.

Pregunta 1 de 4

La página está quieta, con la escena de Three.js en pantalla. ¿Cuántas veces por segundo debe dibujar?

07En tres frases

Bajo demandaDibuja solo cuando cambió el progreso y la escena está en pantalla.
TechoDensidad hasta 1,5; reducir movimiento = un cuadro.
Medirwindow.__renders contado por three-medir.mjs, y el peso de la biblioteca en peso.py.

Para ir más allá

Clase anteriorPróxima clase