跳到主要内容

浏览器差异

三引擎都能跑 WebGL2,会炸生产的是扩展、limits、丢失策略、以及 WebGPU 平台洞。版本数字会过期。能力探测写一次运行时,不要维护「Safari 某版不行」口诀。本章解释 为什么探测会失败

生产默认 WebGL2。WebGPU 是探测成功后的增强,失败降级,不是 2026 年的全平台基线。

文档清单

文档解决的问题
WebGL 扩展与移动端MAX_TEXTURE_SIZE、浮点纹理、实例化、iOS 丢失、热节流
WebGPU 适配与降级adapter null、feature / limits、compatibility mode、安全上下文
Chromium Gecko WebKit 差异清单预乘 alpha、lose context、WebGPU 洞、ANGLE

Android WebView 不能 用桌面 Chrome 版本号推断。小程序 canvas 是另一套嵌入实现,共享心智不共享扩展表。

原则

export interface GpuCaps {
webgl2: boolean;
webgpu: boolean;
maxTextureSize: number;
}

export function detectGpuCaps(): GpuCaps {
const probe = document.createElement("canvas");
const gl = probe.getContext("webgl2", {
failIfMajorPerformanceCaveat: true,
});
const maxTextureSize = gl?.getParameter(gl.MAX_TEXTURE_SIZE) ?? 0;
probe.remove();
return {
webgl2: gl !== null,
webgpu: typeof navigator !== "undefined" && Boolean(navigator.gpu),
maxTextureSize,
};
}

navigator.gpu 存在不等于 requestAdapter() 非 null。Views 探测必须开在 临时 canvas 上,不要污染即将上屏的节点。