首先,WebGL 不限于每次绘制调用 65k 个顶点。gl.drawElements
有一个 64k 的限制,尽管有一个扩展可以消除这个限制。gl.drawArrays
虽然没有这样的限制。
我不知道为什么它很慢,但是查看WebGL Inspector X3DOM 中的框架正在使用gl.drawArrays
我又挖了一点。我尝试使用Web Tracing Framework以及 Chrome 的分析器。它显示了花费大量时间在gl.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