我不明白网络工作者是怎么工作的..。网络工作者是并行的还是被抢占的?
web-workers渲染到webgl上下文是否安全?
如果我只有一个web-worker渲染到webgl上下文,而我的主要“线程”也没有调用worker,那么web-worker渲染到webgl上下文是否安全?
发布于 2012-02-03 01:29:26
This问题的答案基本上是不能从web worker使用webgl,因为web worker没有访问DOM的权限,您必须在canvas对象上调用getContext()来获取webgl上下文。
发布于 2016-06-24 03:37:31
创建Web Worker时,需要给它一个指向JavaScript文件的URI。它将该JavaScript文件加载到一个新的操作系统级线程中。您不能控制对特定核心或线程优先级的亲和性(在撰写本文时),但创建的底层thread是真实的和不受约束的。缺省情况下,在Web Worker的线程中运行的JavaScript不能访问DOM:您不能访问窗口对象或任何与DOM相关的类。
Web Worker线程的语义使其几乎完全脱离了默认的DOM线程。首先有趣的是,Web Worker可以在100%的CPU使用率无限循环中运行,而不必担心冻结UI。这意味着Web Worker不能触发可怕的“警告:无响应脚本”消息框!
不固定的代价是您在DOM和工作线程之间同步和通信的能力是有限的。worker和DOM之间的显式管道是用于发送数据的postMessage() API和用于接收事件的onmessage事件。您可以使用字符串和对象进行postMessage,将数据从源线程的堆克隆到目标线程的堆中。onmessage事件仅由Web Worker在空闲时接收。这意味着,为了将onmessage事件及时地从DOM传递给Web Worker,worker必须频繁地让步;这可能会影响您编写代码的方式。
重要的是要理解,在现代JavaScript实现中有一类特殊的“可转移对象”,其中发送给postMessage()的对象不是克隆的,而是将对象的所有权从一个线程转移到另一个线程。这些都是您希望尽可能发送到postMessage()的数据类型;任何时候在调用postMessage()时克隆数据,都会创建大量垃圾进行GC,系统性能将受到影响。
可转移对象类型的集合一直在稳步增长,Mozilla Development Network、WhatWG和W3C是观看该领域规范研究的好地方。我甚至不能告诉你现在浏览器中可以跨线程传输的所有东西,但是如果我给你一个全面的列表,它可能在一年或更短的时间内就会过时。
关于你最初的问题,在火狐44+上,你现在可以通过HTMLCanvasElement#transferControlToOffscreen函数将画布部分传输到WebWorker。transferControlToOffscreen创建了一个可转移的OffscreenCanvas对象,您可以通过postMessage将该对象传递给Web Worker。在Web Worker上,您可以获取webgl并从工作器线程向画布发出绘图命令,而无需直接访问仍然存在于DOM线程中的实际画布标记的DOM。
https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/transferControlToOffscreen
https://hacks.mozilla.org/2016/01/webgl-off-the-main-thread/
https://stackoverflow.com/questions/9116896
复制相似问题