11

我打开了这个矩阵乘法基准测试,我的浏览器(Firefox 7.0.1)冻结了,直到基准测试完成(我在旧的 Asus EeePC 1000H 中打开了页面)。

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

4

3 回答 3

28

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

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

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

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

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

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

于 2011-10-21T15:27:39.007 回答
6

是的,在 Firefox 上!

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

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

于 2016-06-23T18:57:21.807 回答
3

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

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

于 2015-09-24T13:21:04.987 回答