我打开了这个矩阵乘法基准测试,我的浏览器(Firefox 7.0.1)冻结了,直到基准测试完成(我在旧的 Asus EeePC 1000H 中打开了页面)。
我听说 Web Worker 的发明是为了将处理与显示网页分开。是否有可能利用 Web Workers API 使 WebGL 不会停止整个 Web 浏览器?
我打开了这个矩阵乘法基准测试,我的浏览器(Firefox 7.0.1)冻结了,直到基准测试完成(我在旧的 Asus EeePC 1000H 中打开了页面)。
我听说 Web Worker 的发明是为了将处理与显示网页分开。是否有可能利用 Web Workers API 使 WebGL 不会停止整个 Web 浏览器?
为了清楚起见:您链接到的基准测试根本不使用 WebGL。(我应该知道,是我写的。)对于那个特定的基准测试,你现在绝对可以在 Web Worker 中运行它,它会非常好。
(有趣的事实 - Web Worker 在构建基准测试时不支持 TypedArrays,并且由于大多数矩阵库都依赖于它,因此当时在 Worker 中运行它是不切实际的。这已经得到修复。)
无论如何,回答你原来的问题:不,WebGL 不能在工作人员中运行。对此的核心阻碍是,为了获得 WebGL 上下文,您需要调用getContext
画布元素。Web Worker 明确禁止 DOM 访问(这是一件好事,顺便说一句!),因此您将永远无法从 worker 访问 WebGL。
但这并不像你想象的那么糟糕。一方面,考虑到大多数 3D 渲染实际上都发生在不同的线程中。具体来说,一大堆线程在你的 GPU 上运行。浏览器唯一的部分就是告诉你的图形驱动程序“嘿!开始使用这些数据渲染一些三角形!” 然后它继续前进而不等待三角形实际被渲染。因此,虽然绘图命令必须从主进程执行,但它花费在阻塞该进程上的时间(通常)很少。
当然,如果您正在编写实时游戏,这不会占用您大量时间。你有动画、物理、人工智能、碰撞检测、寻路……有很多非图形任务,如果你让它们吃掉你的 CPU。在某些情况下(动画),它通常只是矩阵数学的一大堆,就像你链接到的基准一样!然而,对我们来说幸运的是,这种类型的处理可以在 Worker 中完成,我们需要与主线程进行通信,只需要渲染场景所需的数据。
是的,这在同步和数据传输方面带来了一些挑战,但总的来说,在我们尝试模拟这 500 个盒子的碰撞时,锁定浏览器要好得多。
是的,在 Firefox 上!
https://hacks.mozilla.org/2016/01/webgl-off-the-main-thread/
我们很高兴在 Firefox 44+ 的 Web Workers 中宣布 WebGL!使用新的 OffscreenCanvas API,您现在可以在主线程之外创建 WebGL 上下文。
默认情况下,您不能在 Web Worker 中使用 WebGL,正如 Toji 所解释的那样。
您可以查看WebGLWorker,它是一个库,通过透明地将命令代理到主线程,您可以在 Web Worker 中执行 WebGL 工作。这是一篇很好的博客文章,解释了它是如何工作的。