首页 > 资讯 >

当前速看:Cesium之Web Workers

2023-04-25 15:38:36 来源:博客园
1. 引言

多线程是编程中常用的方法,例如,在桌面程序中,主线程一般是UI线程,负责UI绘制与用户交互,而运算处理往往是交给背后的工作线程,这样可以有效避免交互时的卡顿感

浏览器是多进程的,每打开一个网页,都会开启一个渲染进程,渲染进程包含:

GUI渲染线程 (有且只有一个)JS引擎线程 (有且只有一个)事件触发线程定时器触发线程异步http请求线程

其中,JS引擎线程就是解析JS代码的线程,由于JS引擎线程有且只有一个,所以JS代码执行是单线程的(笔者注:异步函数是使用任务队列实现的,除非调用了其他线程的函数,如定时器等,不然异步函数还是单线程执行的)


(相关资料图)

GUI渲染线程与JS引擎线程是互斥的,且JS引擎线程会先执行,如果JS代码卡住会导致GUI绘制卡住

有关浏览器架构与原理,可以参考:

浏览器的进程与线程--深入同步、异步问题 - 知乎 (zhihu.com)Web Worker 之全面讲解 - 知乎 (zhihu.com)

Web Workers就是创建JS代码执行的线程,使得JS代码执行能以多线程的方式执行,避免JS引擎线程卡住

有关Web Workers的解释可以参考:

Web Workers API - Web API 接口参考 | MDN (mozilla.org)Web Worker 使用教程 - 阮一峰的网络日志 (ruanyifeng.com)

本文描述浏览器中的Web Workers并基于Cesium源码进行举例

2. Web Workers

通常而言,Web Workers包含:

专用线程(Dedicated Workers)共享线程(Shared Workers)后台线程(Service Workers)等

这里主要是记述通常使用的专用线程(Dedicated Workers)

Web Worker的大致的使用方法如下:

(在主线程里)创建一个Web Worker

const worker = new Worker("WebWorkerTest.js")
WebWorkerTest.js是Web Worker执行的JS代码文件加载Web Worker执行的JS代码文件需要使用HTTP或HTTPS协议,即,需要搭建网络服务器

(在主线程里)向创建的Web Worker发送数据

worker.postMessage([2, 3])

(在子线程Web Worker,即WebWorkerTest.js中)接收主线程的数据、处理并发送给主线程

onmessage = function(e) {    console.log("Message received from main script")    const workerResult = e.data[0] * e.data[1]    console.log("Posting message back to main script")    postMessage(workerResult)}

(在主线程里)接收Web Worker发送的数据

worker.onmessage = (e) => {      console.log("Result:", e.data)    }

综上,此处创建了两个文件:WebWorkerTest.jsWebWorkerTest.html

WebWorkerTest.html代码如下:

  <script>    const worker = new Worker("WebWorkerTest.js")    worker.postMessage([2, 3])    worker.onmessage = (e) => {      console.log("Result:", e.data)    }  </script>

WebWorkerTest.js代码如下:

onmessage = function(e) {    console.log("Message received from main script")    const workerResult = e.data[0] * e.data[1]    console.log("Posting message back to main script")    postMessage(workerResult)}

运行结果如下(使用VS Code和Live Server插件):

更详细的Web Worker的使用方法,可以参考以下文档:

Web Workers API - Web API 接口参考 | MDN (mozilla.org)Web Worker 使用教程 - 阮一峰的网络日志 (ruanyifeng.com)3. Cesium中的Web Workers

Cesium源码中,对Web Workers进行了封装,封装为TaskProcessor

源码中给出的TaskProcessor使用示例为:

const taskProcessor = new Cesium.TaskProcessor("myWorkerPath");const promise = taskProcessor.scheduleTask({    someParameter : true,    another : "hello"});if (!Cesium.defined(promise)) {    // too many active tasks - try again later} else {    promise.then(function(result) {        // use the result of the task    });}

查看源码,可以知道taskProcessor.scheduleTask()函数为:

TaskProcessor.prototype.scheduleTask = function (parameters, transferableObjects) {  // ...  this._worker = createWorker(this);  return Promise.resolve(canTransferArrayBuffer()).then(function (    canTransferArrayBuffer  ) {    processor._worker.postMessage(      {        id: id,        parameters: parameters,        canTransferArrayBuffer: canTransferArrayBuffer,      },      transferableObjects    );    return deferred.promise;  });};

createWorker()函数为

function createWorker(processor) {  const worker = new Worker(getBootstrapperUrl());  worker.postMessage = defaultValue(    worker.webkitPostMessage,    worker.postMessage  );  // ...  return worker;}

不难看出,Cesium中将Web Workers封装成了Promise,既有操作Promise的优雅,又有调用Web Workers带来的多线程优势

例如,在Scene\Primitive.js中,使用TaskProcessor创建Geometry

先是使用createGeometry.js的文件名创建TaskProcessor

if (!defined(createGeometryTaskProcessors)) {    createGeometryTaskProcessors = new Array(numberOfCreationWorkers);    for (i = 0; i < numberOfCreationWorkers; i++) {        createGeometryTaskProcessors[i] = new TaskProcessor("createGeometry");    }}

然后创建promise数组:

promises.push(    createGeometryTaskProcessors[i].scheduleTask(        {            subTasks: subTasks[i],        },        subTaskTransferableObjects    ));

最后使用Promise.all方法执行所有任务并等待结果返回:

Promise.all(promises)    .then(function (results) {    primitive._createGeometryResults = results;    primitive._state = PrimitiveState.CREATED;})    .catch(function (error) {    setReady(primitive, frameState, PrimitiveState.FAILED, error);});
4. 参考资料

[1] Web Workers API - Web API 接口参考 | MDN (mozilla.org)

[2] Web Worker 使用教程 - 阮一峰的网络日志 (ruanyifeng.com)

[3] Cesium原理篇:4Web Workers剖析 - fu*k - 博客园 (cnblogs.com)

[4] 浏览器的进程与线程--深入同步、异步问题 - 知乎 (zhihu.com)

[5] Web Worker 之全面讲解 - 知乎 (zhihu.com)

[6] 使用 Service Worker - Web API 接口参考 | MDN (mozilla.org)

标签:

当前速看:Cesium之Web Workers

本文描述浏览器中的WebWorkers并基于Cesium源码进行举例

2023-04-25

今日快看!祎怎么读音和解释_祎怎么读

1、祎yī部首笔画部首:礻部外笔画:4总笔画:8五笔86:PYFH五笔98:PYFH仓颉:IFQS笔顺编号:45241152四

2023-04-25

环球最新:证监会核发首批542亿元企业债券落地 四川4家企业获注册

4月23日,在两部委联合发布《关于企业债券发行审核职责划转过渡期工作安排的公告》后首个工作日,证监会对

2023-04-25

环球新资讯:Telegram Premium提供双倍的限制4GB文件上传更快的下载速度等等

Telegram已在全球达到7亿用户活跃用户,该公司已按照承诺推出“TelegramPremium”。订阅服务将为用户提供独

2023-04-25

第二届全国青年藏学研讨会第一轮通知

联系方式  刘星雨:010-64932378  索朗卓玛:010-64945122  报名邮箱:sonatozer1322@163 com  附

2023-04-25

jenkins项目上线(测试上线)教程

jenkins项目上线(测试上线)教程。如何使用jenkins把项目上线?如何提测?实现方法1 选择测试或者生产(

2023-04-25

当前热点-保险伴我一生教材课本图片 保险伴我一生

今天来聊聊关于保险伴我一生教材课本图片,保险伴我一生的文章,现在就为大家来简单介绍下保险伴我一生教材

2023-04-25

【环球新要闻】人民币兑美元中间价报6.8847,下调12个基点

前一交易日中间价报6 8835。

2023-04-25

纪念延安双拥运动80周年,健康义诊进军营 每日速讯

纪念延安双拥运动80周年,健康义诊进军营

2023-04-25

公安部交通管理局部署“五一”假期交通管理工作 全力保障群众假期出行安全顺畅|天天日报

4月24日,公安部交通管理局召开全国视频会议,部署2023年“五一”假期交通管理工作。今年“五一”假期时...

2023-04-25

信息:北京东城召开优化营商环境大会 发布产业发展全要素政策服务包

北京东城召开优化营商环境大会发布产业发展全要素政策服务包

2023-04-25

大连:“汽车后备箱集市”好玩又有趣

世界和平公园后备箱集市里的摊位都经过摊主精心布置,有趣又好玩。大连新闻传媒集团记者祝福摄包罗万象小车

2023-04-25

模拟经营《宠物店模拟器》Steam页面上线 支持简繁体中文

今日(4月25日),模拟经营游戏《宠物店模拟器》Steam页面上线,游戏支持简繁体中文,发售日期待定,感兴趣

2023-04-25

【天天时快讯】务川自治县黄都镇组织开展“全民阅读”活动

近日,务川自治县黄都镇组织离退休干部与年轻干部一起开展“书香务川全民阅读”读书分享会。会上,年轻...

2023-04-25

观速讯丨我市高效推进医疗器械风险隐患排查

近日,市市场监管局对医疗机构、医疗器械经营使用单位开展了质量安全风险隐患排查,进一步提升质量安全保障

2023-04-25

【环球热闻】中广核新田储能电站项目即将完工投入运营

近年来,随着用电负荷的不断攀升、能源清洁低碳的飞速发展,电池储能技术的应用已成为电力保供、保安全稳定

2023-04-25

关注:2023年北京义务教育入学重要时间安排+咨询电话

近日,2023年北京市义务教育阶段入学政策已经发布。今年北京市义教入学工作主要有哪些内容?工作时间如何安

2023-04-25

中经评论:发达经济体通胀居高不下

近期主要发达经济体核心CPI依然居高不下甚至有所回升这令各方对其货币政策走向产生较大分歧更引发了市场对

2023-04-25

媒体融合加速 主流舆论壮大——2023中国网络媒体论坛综述-全球聚焦

4月21日至22日,2023中国网络媒体论坛在江苏南京举行。与会人士深入研讨认为,媒体融合正在加速,主流舆论

2023-04-25

连板池:华建集团(地下管网)4天2板 每日快讯

4月25日,截至发稿,有以下个股走出了连板行情,分别为华建集团(地下管网)4天2板;鸿博股份(ChatGPT概念

2023-04-25

【播资讯】高叶北影节红毯造型曝光,鎏金薄裙配烈焰红唇,气质不输陈舒婷

红毯是娱乐圈中的一种重要典礼,它不仅是电影、电视等作品的展示平台,更是明星们展示自我风格和魅力的重要

2023-04-25

施密特正交化单位化公式_施密特正交化

你们好,最近小品发现有诸多的小伙伴们对于施密特正交化单位化公式,施密特正交化这个问题都颇为感兴趣的,

2023-04-25

类银河城新游《心渊梦境》发售!登陆Steam等海外全平台

国产手绘风格类银河战士恶魔城单机游戏《心渊梦境》今日在海外全平台正式发售!

2023-04-25

每日信息:第九届湖北省职工职业技能大赛电焊工决赛举行

选手正在比赛。4月23日,第九届湖北省职工职业技能大赛电焊工决赛在中国一冶钢构公司阳逻生产基地开赛。大

2023-04-25

模型可以预测头颈癌术后放疗延迟_资讯

根据4月19日在线发表于JAMAOtolaryngology-Head&颈部手术。来自堪萨斯城堪萨斯大学医学

2023-04-25

海天瑞声(688787)盘中异动 股价振幅达6.42% 跌7.3% 报166元(04-25)_每日看点

2023年1-2月各金属材料产量统计 环球今头条

迎“篮”而上,新光小学运动健儿勇创佳绩 要闻

天天新资讯:新时代 新征程 新伟业·全力拼经济 各地在行动丨2023年“万人助万企”活动重点确定 从助企纾困到育链强链

一季度新增就业297万人 2023年“三支一扶”计划选派3.4万名高校毕业生-环球观天下

世界快看点丨黑紫向日葵的养殖方法(黑紫向日葵的养殖方法图解)

神农架春雪压芳菲美景醉游人 热点在线

欧派家居最新公告:2022年净利润增长0.86%至26.88亿元_全球新要闻

晨读 | 伴农:空白处的智慧

环球精选!太平绅士梁朝伟_太平绅士

突然跳水,37倍大牛股爆业绩利空,养老金提前跑路_今热点

当前讯息:电脑vt是什么东西_电脑vt是什么意思

韶关是哪个省的城市华寺图_韶关是哪个省的-环球实时

【世界聚看点】媒体:阻止“约死”是全社会的责任具体详细内容是什么

世界快看点丨日出江花红胜火春来江水绿如蓝的作者出处及全诗意思赏析_日出江花红胜火解释

黄晓明的现任妻子是谁_黄晓明的现任妻子 看点

环球看点!华建集团龙虎榜:三个交易日机构净买入1.46亿元

6年前孩子出生忘了上户口,快上学了爸爸着急求助民警

九牧王林聪颖,压制不住“赚快钱”的欲望?

杜甫遥怜小儿女未解忆长安_遥怜小儿女未解忆长安-全球报道

热资讯!中国恒大(03333.HK):拟收购恒大汽车旗下住宅及物业发展项目

世界看点:百爪挠心的意思_百爪挠心如何造句

安徽农大:组团下乡全力防控小麦赤霉病 全球快播

“大美致简 非凡至远”2023华硕春季新品发布会多款新品重磅出击

【新视野】拉玛西亚天赋天花板?15岁进入巴萨替补席,亚马尔会是新梅西?

Copyright @  2015-2022 纵横家电网版权所有  备案号: 浙ICP备2022016517号-12   联系邮箱:51 46 76 11 3 @qq.com