代码之家  ›  专栏  ›  技术社区  ›  Toki

3.js-如何检测设备性能/功能并相应地为场景元素提供服务

  •  0
  • Toki  · 技术社区  · 5 年前

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

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

    另外还有一个很好的方法( Using javascript to detect device CPU/GPU performance? )其中包括测量渲染循环的速度作为检测性能的一种方法,但这是我们可以想出的最佳解决方案吗?

    一如既往地谢谢你!

    1 回复  |  直到 5 年前
        1
  •  1
  •   Garrett Johnson    5 年前

    浏览器不能提供很多关于它们运行的硬件的信息,所以很难提前确定设备的能力。与 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
    });
    

    将该信息(如果可用)与其他总帐上下文信息(如 max texture size 我是说, available shader precision ,等)和其他可通过 platform.js 您可能可以猜测当前平台的功能有多强大。

    不久前,我正在研究这个确切的问题,但最终似乎很难在这么多不同因素的作用下做出正确的猜测。相反,我选择构建一个包来迭代地改进场景以提高性能,这可能包括加载或交换模型的详细级别。

    希望这至少有点帮助!