在Web Worker中使用WebGL:有可能吗?怎么样?

时间:2011-10-21 04:11:08

标签: html html5 webgl web-worker

我打开了这个matrix multiplication benchmarks,我的浏览器(Firefox 7.0.1)冻结,直到基准测试结束(我在旧的华硕EeePC 1000H中打开了页面)。

我听说网络工作者是为了将处理与显示网页分开而发明的。是否可以利用Web Workers API使WebGL不会停止整个Web浏览器?

3 个答案:

答案 0 :(得分:25)

为了清楚起见:您链接到的基准测试根本不使用WebGL。 (我应该知道,我写了它。)对于那个特定的基准测试,你现在绝对可以在Web Worker中运行它,它会非常好。

(有趣的事实 - Web Workers在构建基准测试时不支持TypedArrays,并且由于大多数矩阵库都依赖于它,因此当时在Worker中运行它是不切实际的。那已经修复了。)

无论如何,要回答你原来的问题:不,WebGL不能在一个工人中运行。对此的核心阻止是,为了获得WebGL上下文,您需要在canvas元素上调用getContext。 Web Workers明确禁止访问DOM(这是一件好事,BTW!)因此,您永远无法从工作人员访问WebGL。

但这并不像你想象的那么糟糕。首先,考虑到大多数3D渲染实际上都是在不同的线程中发生的。具体来说,在GPU上运行一大堆线程。浏览器中唯一的部分是告诉你的图形驱动程序“嘿!开始使用这些数据渲染一些三角形!”然后它继续前进而不等待实际呈现三角形。因此,虽然必须从主进程执行绘制命令,但是它花费阻止该进程的时间(通常)非常少。

当然,如果您正在编写实时游戏,那就不会占用您的大量时间。你有动画,物理,人工智能,碰撞检测,寻路...有很多非图形化的任务,如果你让他们活着就会占用你的CPU。在某些情况下(动画),它通常只是矩阵数学的gobs和gobs,就像你链接的基准!但幸运的是,对于我们来说,这种类型的处理可以在Worker中完成,而我们需要与主线程进行通信的所有内容都是渲染场景所需的数据。

是的,这在同步和数据传输方面带来了一些挑战,但总的来说,在我们尝试模拟这500个盒子碰撞时锁定浏览器将会非常可取。

答案 1 :(得分:3)

默认情况下,您无法在Web Worker中使用WebGL,如Toji所述。

您可以通过透明地将命令代理到主线程,查看WebGLWorker这是一个允许您在Web Worker中执行WebGL内容的库。 这是一个很好的blog post,它解释了它是如何工作的。

答案 2 :(得分:3)

是的,在Firefox上!

https://hacks.mozilla.org/2016/01/webgl-off-the-main-thread/

  

我们很高兴在Firefox 44+中宣布Web Workers中的WebGL!使用新的OffscreenCanvas API,您现在可以从主线程创建WebGL上下文。