html - 从 Web Worker 内部使用 WebGL : is it possible ? 如何?

标签 html webgl web-worker

我打开了这个matrix multiplication benchmarks并且我的浏览器 (Firefox 7.0.1) 卡住,直到基准测试完成(我在旧的 Asus EeePC 1000H 中打开页面)。

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

最佳答案

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

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

无论如何,回答您最初的问题:不,WebGL 不能在工作程序中运行。核心障碍是为了获得 WebGL 上下文,您需要在 Canvas 元素上调用 getContext。 Web Workers 明确禁止 DOM 访问(这是一件好事,顺便说一句!),因此您将永远无法从 worker 访问 WebGL。

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

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

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

关于html - 从 Web Worker 内部使用 WebGL : is it possible ? 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7844886/

相关文章:

javascript - 获取 UV 坐标处纹理的颜色

javascript - 当我尝试缓存 xxx.worker.js 时,Service Worker 不会安装

javascript - 如何调试共享网络 worker ?

javascript - 使用 javascript 单击单选按钮时如何启用/禁用文本框?

html - anchor 元素正在将 <li> 元素添加到其子元素 <ul>

javascript - WebGL 上下文无缘无故地完全重绘

javascript - 如何像Chrome一样用three.js做一颗星星实验10万颗星星

html - CSS:span 和 li 的高度不匹配

javascript - 如何使用 for 循环从另一个元素中提取元素并插入到 JavaScript 数组中?

javascript - 如何通过 importScripts 将 js 函数导入到 webWorker 中