2

下面的模型在几款低端机器上都有不错的表现:

http://examples.x3dom.org/example/x3dom_sofaGirl.html

然而,在配备 Nvidia GT 650m 的 MacBook Pro 上,帧速率非常低。我以为是因为 MacBook 没有OES_element_index_uint扩展,但如果我这样做了,就会显示扩展:

document.createElement("canvas").getContext("experimental-webgl").getSupportedExtensions();

重构低于 65K 的网格解决了这个问题。有没有什么办法不用重组就能有好的表现?

我安装了一个应用程序 (gfxCardStatus),它禁用了 GT 650m 并强制只使用集成显卡。现在,一切正常。这是驱动程序错误吗?

我发现另一个 3d 场景在专用 GPU 上比在集成 GPU 上运行得更快:

http://examples.x3dom.org/binaryGeo/oilrig_demo/index.html

我认为这是因为它由许多小网格组成。此外,当我运行这个场景时,我可以听到 GPU 风扇转动的声音。它没有与 sofaGirl 场景。

4

1 回答 1

1

首先,WebGL 不限于每次绘制调用 65k 个顶点。gl.drawElements有一个 64k 的限制,尽管有一个扩展可以消除这个限制。gl.drawArrays虽然没有这样的限制。

我不知道为什么它很慢,但是查看WebGL Inspector X3DOM 中的框架正在使用gl.drawArrays

x3dom 不限于 65k

我又挖了一点。我尝试使用Web Tracing Framework以及 Chrome 的分析器。它显示了花费大量时间在gl.readPixels.

显示 readpixels 的分析器

为了查看这是否是问题,我打开了 JavaScript 控制台并替换gl.readPixels为这样的无操作

在 JavaScript 控制台中:

// find the canvas
c = document.getElementsByTagName("canvas")[0]

// get the webgl context for that canvas
gl = c.getContext("webgl")

// replace readPixels with a no-op
gl.readPixels = function(x, y, w, h, f, t, b) { 
  var s = w * h * 4; 
  for (var ii = 0; ii < s; ++ii) {
    b[ii] = 0;
  }
};

已从readPixels探查器中删除

在此处输入图像描述

但样本并没有运行得更快。

接下来,我尝试用hackingdrawArrays来减少绘制。

在 JavaScript 控制台中:

// save off the original drawArrays so we can call it
window.origDrawArrays = gl.drawArrays.bind(gl)

// patch in our own that draws less
gl.drawArrays = function(t, o, c) { window.origDrawArrays(t, o, 50000); }

你知道吗,现在它运行得非常快。唔。也许这是一个驱动程序错误。它被要求绘制 1070706 个顶点,但这对于 NVidia GT 650m 来说似乎不是一个很大的数字


所以,我不知道为什么,但我想研究这个问题。我编写了一个本机应用程序来显示相同​​的数据。它以 60fps 轻松运行。我像OP所说的那样检查了WebGL中的集成图形。也很容易达到60fps。NVidia 650GT 的速度约为 1fps。

我还检查了 Safari 和 Firefox。他们也运行得很慢。常见的是角度。他们都使用 ANGLE 来重写着色器。也许那里有一个问题,因为同一个着色器在我的本机测试中运行良好。当然,Native 测试与 WebGL 做的事情并不完全相同,但它不仅仅是绘制 1M 多边形。

所以我提交了一个错误: https ://code.google.com/p/chromium/issues/detail?id=437150

于 2014-11-26T23:37:44.667 回答