perf(movimento): vitrine e 3D mais leves, WebGL por software lembrado na sessão e suporte ao WebKit

This commit is contained in:
Evandro Fonseca Junior committed 2026-10-14 22:54:27 -03:00
1 parent 9fd1570426
commit 8903f3c57e
28 files changed
+854 -406

No files matched your search

+42
View File
@@ -72,3 +72,45 @@ export function isSoftwareWebGL(
const renderer: unknown = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
return typeof renderer === "string" && isSoftwareRenderer(renderer);
}
const SOFTWARE_WEBGL_KEY = "webgl-software";
/**
* O WebGL deste aparelho já se mostrou por software nesta sessão (aba)? Abrir um contexto só para descobrir custa uma
* tarefa longa (150 ms na GPU, 500 ms ou mais por software), então quem abre o contexto de verdade anota o veredito
* aqui e as páginas seguintes da sessão já nascem estáticas. `sessionStorage` bloqueado vale como "não sei".
*/
export function isKnownSoftwareWebGL() {
try {
return sessionStorage.getItem(SOFTWARE_WEBGL_KEY) === "1";
} catch {
return false;
}
}
/** Anota na sessão que o WebGL deste aparelho desenha por software (ver `isKnownSoftwareWebGL`). */
export function rememberSoftwareWebGL() {
try {
sessionStorage.setItem(SOFTWARE_WEBGL_KEY, "1");
} catch {
// armazenamento bloqueado (modo privado, política do navegador): sem anotação, a próxima página testa de novo
}
}
/**
* O navegador é WebKit (Safari no Mac, no iPhone e no iPad; no iOS todo navegador é WebKit)? É o único que deixa em
* branco um vídeo que ainda não tocou uma vez, mesmo com o quadro já decodificado: só nele vale tocar e pausar o
* vídeo da vitrine para ele aparecer, e tocar faz o arquivo inteiro ser baixado (ver PinnedReel).
*/
export function isWebKit() {
if (typeof navigator === "undefined") return false;
const { userAgent, platform, maxTouchPoints } = navigator;
// o iPad com "site para computador" se apresenta como Mac, mas é o único Mac com toque
const iOS =
/iP(hone|ad|od)/.test(userAgent) ||
(platform === "MacIntel" && maxTouchPoints > 1);
const safari =
/Safari\//.test(userAgent) &&
!/Chrome|Chromium|Edg|OPR|Android/.test(userAgent);
return iOS || safari;
}