我打开这个矩阵乘法基准我的浏览器 (Firefox 7.0.1) 冻结,直到基准测试完成(我在旧的 Asus EeePC 1000H 中打开页面)。
我听说网络工作者的发明是为了将处理与显示网页分开。是否可以利用 Web Workers API 使 WebGL 不会停止整个 Web 浏览器?
为了清楚起见:您链接到的基准测试根本不使用 WebGL。 (我应该知道,是我写的。)对于特定的基准测试,您现在绝对可以在 Web Worker 中运行它,而且效果非常好。
(有趣的事实 - Web Workers 在构建基准测试时不支持 TypedArrays,并且由于大多数矩阵库都依赖于当时在 Worker 中运行它是不切实际的。此后这个问题已得到修复。)
不管怎样,回答你原来的问题:不,WebGL 不能在工作线程中运行。核心阻碍是为了获取 WebGL 上下文,您需要调用getContext
在画布元素上。 Web Workers 明确禁止 DOM 访问(顺便说一句,这是一件好事!),因此您将永远无法从 Worker 访问 WebGL。
但这并不像您想象的那么糟糕。其一,考虑到大多数 3D 渲染实际上都发生在不同的线程中。具体来说,是在 GPU 上运行的一大堆线程。浏览器的唯一部分是告诉您的图形驱动程序“嘿!开始使用这些数据渲染一些三角形!”然后它继续前进,而不等待三角形被实际渲染。因此,虽然绘制命令必须从主进程执行,但阻塞该进程所花费的时间(通常)非常少。
当然,如果您正在编写实时游戏,那么这不会占用您大量的时间。你有动画、物理、人工智能、碰撞检测、寻路……其中涉及很多非图形任务,如果你允许的话,它们会耗尽你的 CPU。在某些情况下(动画),它通常只是大量的矩阵数学,就像您链接到的基准一样!然而,对我们来说幸运的是,这种类型的处理可以在 Worker 中完成,并且我们需要与主线程通信的只是渲染场景所需的数据。
是的,这在同步和数据传输方面带来了一些挑战,但总的来说,这比在我们尝试模拟这 500 个盒子碰撞时锁定浏览器要好得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)