THREE.JS-如何检测设备性能/功能并相应地服务场景元素

时间:2018-12-03 00:49:39

标签: three.js

我希望能够在场景中实现条件设置,以服务于不同的网格和材料或较低的多边形模型导入。这方面很简单,但是我正在寻找检测系统渲染Three.js场景功能的最佳或最有效(/最佳实践)方法?

作为参考:关于这个问题的答案(How to check client perfomance for webgl(three.js))建议使用插件,如前所述,该插件在场景创建之后而不是在场景创建之前检查性能。

这里还有一种不错的方法(Using javascript to detect device CPU/GPU performance?),其中涉及测量渲染循环的速度以检测性能,但这是我们能想到的最佳解决方案吗?

一如既往的感谢!

1 个答案:

答案 0 :(得分:0)

浏览器无法提供有关他们所运行的硬件的大量信息,因此很难确定设备的超前能力。使用WEBGL_debug_renderer_info扩展名,您可以(也许)获得有关所使用的图形硬件的更多详细信息,但是返回的值似乎不一致且there's no guarantee that the extension will be available。这是输出示例:

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)

我创建了this gist来提取并大致解析该信息:

function extractValue(reg, str) {
    const matches = str.match(reg);
    return matches && matches[0];
}

// WebGL Context Setup
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);

// Full card description and webGL layer (if present)
const layer = extractValue(/(ANGLE)/g, renderer);
const card = extractValue(/((NVIDIA|AMD|Intel)[^\d]*[^\s]+)/, renderer);

const tokens = card.split(' ');
tokens.shift();

// Split the card description up into pieces
// with brand, manufacturer, card version
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上下文信息(例如max texture sizeavailable shader precision等)和通过platform.js获得的其他设备信息,您也许可以开发对当前平台的强大功能的猜测。

不久前,我一直在研究这个确切的问题,但最终似乎很难对这么多不同的因素进行猜测。相反,我选择构建一个迭代改进的包,以修改场景以提高性能,其中可能包括加载或交换模型细节级别。

希望至少能有所帮助!