在Web Worker中使用WebGL:是否可能?如何实现?

11

我打开了这个矩阵乘法基准测试,我的浏览器(Firefox 7.0.1)在测试完成之前一直卡住(我在一台旧的Asus EeePC 1000H上打开了该页面)。

我听说 Web Workers 被发明出来是为了将处理和显示网页的过程分开。使用 Web Workers API 可以使 WebGL 不会阻塞整个 Web 浏览器吗?


在其他新闻中,那个基准测试已经过时了(使用旧版本的各种矩阵库),是错误和无效的(没有检查被调用的函数是否实际上正在计算相同的内容)。这里有一个没有问题的基准测试:http://stepheneb.github.com/webgl-matrix-benchmarks/matrix_benchmark.html - gman
1
还没有。但是只要在WebWorker中搜索WebGL,你就会发现它正在进行中。 - abergmeier
3个回答

29
为了澄清一下:你链接的基准测试根本没有使用WebGL。(我知道,因为我写过。)而在这个特定的基准测试中,现在完全可以在Web Worker中运行它,并且效果非常好。
有趣的事实是,在构建该基准测试时,Web Workers不支持TypedArrays,由于大多数矩阵库依赖于此,因此在那个时候在Worker中运行它是不切实际的。但是这种情况已经得到了解决。
无论如何,回答您最初的问题:不,WebGL无法在Worker中运行。这里的核心障碍是,为了获取WebGL上下文,您需要在canvas元素上调用getContext。Web Workers明确禁止DOM访问(顺便说一下,这是件好事!),因此您永远无法从Worker访问WebGL。
但情况并不像您想象的那样糟糕。首先,请考虑,大多数3D渲染实际上正在不同的线程中发生。具体来说,是在您的GPU上运行的一堆线程。浏览器要做的唯一部分就是告诉您的图形驱动程序“嘿!使用这些数据开始呈现一些三角形!”然后它继续执行而不等待三角形实际上被呈现。因此,虽然绘制命令必须从主进程执行,但它所花费的时间阻塞该进程(通常)非常少。
当然,如果您正在编写实时游戏,这不会成为您大量消耗时间的部分。您还有动画、物理、AI、碰撞检测、寻路...如果让它们自由运行,它们将吃掉您的CPU。在某些情况下(比如动画),它通常只是一堆矩阵数学,就像您链接的基准测试!幸运的是,这种类型的处理可以在Worker中完成,我们需要向主线程传回的所有信息只是用于呈现场景的数据。
是的,这会引入一些同步和数据传输方面的挑战,但总体来说,与在尝试模拟那些500个方块碰撞时锁定浏览器相比,这将是极其可取的。

哦...由于这些脚本被称为glMatrix和CanvasMatrix,我认为它们利用了WebGL来乘以矩阵... - João Pinto Jerónimo

7

2
这并不完全正确。它只是一个非常有限的API,仅使用transferControlToOffscreen API进行画布渲染。 - loretoparisi

3

默认情况下,你不能在Web Worker中使用WebGL,正如Toji所解释的那样。

你可以查看WebGLWorker这个库,它允许你在Web Worker中做WebGL的事情,通过透明地代理命令到主线程。 这里有一篇很好的博客文章,解释了它是如何工作的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接