perf(movimento): vitrine e 3D mais leves, WebGL por software lembrado na sessão e suporte ao WebKit
This commit is contained in:
1 parent
9fd1570426
commit
8903f3c57e
28 files changed
+854
-406
No files matched your search
@@ -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;
|
||||
}
|
||||
Reference in new issue
Block a user