浏览器无法提供有关其运行的硬件的大量信息,因此很难事先确定设备的能力。使用
WEBGL_debug_renderer_info
扩展名,您可以(可能)获取有关正在使用的图形硬件的更多详细信息,但返回的值似乎不一致,并且
不能保证扩展名将可用。以下是输出示例:
ANGLE (Intel(R) HD Graphics 4600 Direct3D11 vs_5_0 ps_5_0)
ANGLE (NVIDIA GeForce GTX 770 Direct3D11 vs_5_0 ps_5_0)
Intel(R) HD Graphics 6000
AMD Radeon Pro 460 OpenGL Engine
ANGLE (Intel(R) HD Graphics 4600 Direct3D11 vs_5_0 ps_5_0)
我已经创建了一个 gist,可以提取并大致解析这些信息:
这里是链接。
function extractValue(reg, str) {
const matches = str.match(reg);
return matches && matches[0];
}
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
const layer = extractValue(/(ANGLE)/g, renderer);
const card = extractValue(/((NVIDIA|AMD|Intel)[^\d]*[^\s]+)/, renderer);
const tokens = card.split(' ');
tokens.shift();
const manufacturer = extractValue(/(NVIDIA|AMD|Intel)/g, card);
const cardVersion = tokens.pop();
const brand = tokens.join(' ');
const integrated = manufacturer === 'Intel';
console.log({
card,
manufacturer,
cardVersion,
brand,
integrated,
vendor,
renderer
});
如果有信息可用,您可以使用该信息以及其他gl上下文信息(如最大纹理大小,可用着色器精度等)和通过platform.js获得的其他设备信息,可能能够开发出对当前平台强度的猜测。
不久前,我也在研究这个问题,但最终似乎难以在如此多的不同因素影响下做出良好的猜测。相反,我选择构建一个包,通过迭代地改进场景来提高性能,其中可能包括加载或交换模型细节级别。
希望这至少有点帮助!