繁体   English   中英

Web Worker可以在WebGL-Canvas上渲染吗?

[英]May a Web Worker render on WebGL-Canvas?

我不了解网络工作者的工作方式...网络工作者是平行的还是被抢占了?

对于Web工作者来说,渲染到WebGL上下文是否安全?

如果我只有一个Web工作者渲染到webgl上下文,并且我的主要“线程”也没有调用该工作程序,那么对Web工作者渲染到webgl上下文是否安全?

创建Web Worker时,您给它提供一个指向JavaScript文件的URI。 它将JavaScript文件加载到新的OS级线程中。 您无法控制对特定内核或线程优先级的亲和力(截至撰写本文时),但是创建的基础线程是真实的且不受约束。 默认情况下,在Web Worker线程中运行的JavaScript无法访问DOM:您无权访问窗口对象或任何与DOM相关的类。

Web Worker线程的语义使其几乎完全不受默认DOM线程的限制。 有趣的第一件事是,Web Worker可以在100%CPU使用率无限循环中运行,而不必担心冻结UI。 这意味着Web Worker无法触发可怕的“警告:无响应脚本”消息框!

不受限制的折衷是您在DOM与工作线程之间进行同步和通信的能力受到限制。 worker和DOM之间的显式管道是用于发送数据的postMessage()API和用于接收事件的onmessage事件。 您可以使用字符串和对象的PostMessage,将数据从源线程的堆克隆到目标线程的堆中。 仅当您的Web Worker空闲时,才会接收onmessage事件。 这意味着,为了及时将消息事件从DOM传递到您的Web Worker,该Worker必须经常屈服。 这可能会妨碍您编写代码的方式。

重要的是要理解,现代JavaScript实现中有一类特殊的“可传输对象”,其中不会克隆您发送到postMessage()的对象,而是将对象的所有权从一个线程转移到另一个线程。 这些是您想尽可能发送到postMessage()的数据类型。 每次在调用postMessage()时克隆数据时,都会创建大量的垃圾以进行GC处理,并且系统性能会受到影响。

那里的可转移对象类型的集合在稳步增长,Mozilla开发网络,WhatWG和W3C是观看该领域规范研究的好地方。 如今,我什至无法告诉您所有可以在浏览器中跨线程传输的功能,但是如果我为您提供了完整的列表,那么它可能会在一年或更短的时间内过时。

关于最初的问题,在Firefox 44+上,您现在可以通过HTMLCanvasElement#transferControlToOffscreen函数将Canvas部分传输到WebWorker。 transferControlToOffscreen创建一个Transferable OffscreenCanvas对象,您可以将Messagepost传递到Web Worker。 在Web Worker上,您可以获取webgl CanvasContext并从worker线程向画布发布绘图命令,而无需直接访问仍然存在于DOM线程中的实际canvas标签的DOM。

https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/transferControlToOffscreen

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

这个问题的答案基本上表明您不能使用来自Web Worker的webgl,因为Web Workers无法访问DOM,并且您必须在canvas对象上调用getContext()以获得webgl上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM