Cesium原理篇:4Web Workers剖析(2)
What’s the WebWorkers?
2008 年 W3C 制定出第一个 HTML5 草案中提出了工作线程(Web Worker)的概念,并且规范出 Web Worker 的三大主要特征:能够长时间运行(响应),理想的启动性能以及理想的内存消耗。Web Worker 允许开发人员编写能够长时间运行而不被用户所中断的后台程序,去执行事务或者逻辑,并同时保证页面对用户的及时响应。
Web Workers类型有哪些?
- 专用线程(Dedicated Workers)
由主线程创建,并且只能和主线程通信。相当于每一次创建都是一个新的实例。 - 共享线程(Shared Workers)
在同一域名下,可以和任何进程通信(不同的Tabs,iFrames等)。可以理解为第一次创建就是在浏览器中停驻,类似一个MemoryCache,此后如果其他页面需要创建该实例时,都会引用同一个Worker,成为跨进程的单例。 - 后台线程(Service Workers)
2014年推出的新规范,该API可以提供后台服务的能力,比如后台消息传递,代理伪装,离线,消息推送等有意思的功能。本人测试Chrome下支持,但IE下日常(不支持)。
Web Workers可以干什么?
JavaScript是异步的单线程,通过时间片轮换模拟并发效果(可参考之前写的《Web Workers实践》)。随着移动互联网以及带宽的提高,而HTML5提供了前端渲染的诸多好处(效果效率灵活轻量级),前端需要处理越来越多的数据,传输和解析也成为了一个很大的瓶颈。Workers+Promise绝对让你爽歪歪。下面举两个很实际的场景,让各位有一个清楚的认识。
应用场景1:后台计算能力
通过Worker将大量数据分析,统计的工作放到后台进行。比如为了减少文件大小,我们往往会做一次zip压缩,好处很明显,既可以加密,有可以极大的提高网络传输的速度。但在传统的JS中,zip解压缩的性能损失是巨大的。随着技术的发展,鱼和熊掌也是可以兼得的。通过Workers技术,我们把数据的解压缩和解析的工作交给子线程来处理,减轻主线程的负担。如下,现在我们可以将Update放到Workers线程,主线程专注Render以及和用户的交互。
应用场景2:共享线程代理多用户
通过共享Worker,可以在多个进程中共用一个线程,接收从不同连接发送过来的指令,然后实现自己的指令处理逻辑,指令处理完成后将结果返回到各个不同的连接用户。有了这种代理技术,可以衍生出很多有意思的功能,在代理中对参数安全性进行审核,对并发数统计,用户自定义的JS函数的权限管理等,都可以通过子线程加一层壳来进行过滤。
性能至上
任何的技术都是有消耗的,关键在于技术人员针对自身情况,做出一个合理选择,这取决于经验和对各种因素全面的衡量。下面给出一些关键时间消耗,供各位选择。
- Workers的创建一般都在1ms内,可以忽略不计
- PostMessage时间
不同浏览器差异较大,Chrome下80ms左右,而IE只有25ms
理论讲,如果Worker创建后调用PostMessage,此时PostMessage事件会放在请求队列,而此后的PostMessage则会直接在WebCore中响应,也就是首次事件可能时间要略久,但测试发现这种差异不并不存在或不明显。 - OnMessage
各个浏览器中时间消耗很小,忽略不计。 - Transferring
默认的参数都是Copy形式,如果参数对象很大,而且在线程中并不修改该对象值,则可以使用Transferring,则参数为引用形式。否则参数拷贝会消耗大量时间。 - 创建多个Workers后的性能
未测试具体时间,但在真实应用中体验很不错
缺点
Workers下不支持DOM对象,不支持Mutex,并不是一种彻底的多线程方案。个人认为Workers主要是把数据部分的工作放到线程,提供后台计算能力,让主线程和子线程更好的专注自己的工作,提高每个线程的性能。
Service Workers需要HTTPS才能使用,localhost除外,这太不实用。导致这一有意思的功能只能玩玩而已。
Cesium原理篇:4Web Workers剖析(2)的更多相关文章
- Cesium原理篇:3最长的一帧之地形(2:高度图)
这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面. 此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...
- Cesium原理篇:7最长的一帧之Entity(下)
上一篇,我们介绍了当我们添加一个Entity时,通过Graphics封装其对应参数,通过EntityCollection.Add方法,将EntityCollection的Entity传递到DataSo ...
- Cesium原理篇:5最长的一帧之影像
如果把地球比做一个人,地形就相当于这个人的骨骼,而影像就相当于这个人的外表了.之前的几个系列,我们全面的介绍了Cesium的地形内容,详见: Cesium原理篇:1最长的一帧之渲染调度 Cesium原 ...
- Cesium原理篇:4Web Workers剖析
JavaScript是单线程的,又是异步的,而最新的HTML5中,通过Web Workers可以在JS中支持多线程开发.这是几个意思?异步还是单线程,这怎么理解?Web Workers又是什么原理?实 ...
- Cesium原理篇:3最长的一帧之地形(3:STK)
有了之前高度图的基础,再介绍STK的地形相对轻松一些.STK的地形是TIN三角网的,基于特征值,坦白说,相比STK而言,高度图属于淘汰技术,但高度图对数据的要求相对简单,而且支持实时构建网格,STK具 ...
- Cesium原理篇:3D Tiles(1)渲染调度
Cesium在2016年3月份左右推出3D Tiles数据规范,在glTF基础上提供了LOD能力,定位就是Web环境下海量三维模型数据.虽然目前3D Tiles还是Beta阶段,有不少硬伤,但3D T ...
- Cesium原理篇:3D Tiles(2)数据结构
上一节介绍3D Tiles渲染调度的时候,我们提到目前Cesium支持的Cesium3DTileContent目前支持如下类型: Batched3DModel3DTileContent Instanc ...
- Cesium原理篇:3D Tiles(3)个人总结
个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹? 好的方面 数据规范 我非常喜欢glTF的整体设计,概括有四点:第一,数据块(B ...
- Cesium原理篇:3D Tiles(1)渲染调度【转】
Cesium在2016年3月份左右推出3D Tiles数据规范,在glTF基础上提供了LOD能力,定位就是Web环境下海量三维模型数据.虽然目前3D Tiles还是Beta阶段,有不少硬伤,但3D T ...
随机推荐
- webpack的配置
使用webpack工具需要配置一个根目录下的配置文件,文件名默认为webpack.condfig.js,配置文件导出一个模块对象,包含了webpack工具的相关配置参数,这个模块对象将会以参数形式被引 ...
- Spket在Eclipse下的安装和配置(图文教程)
一.Spket简介 Spket是一个RIA的开发工具,具有代码自动完成.语法高亮.内容概要等功能,可以帮助开发人员高效的编写JavaScript程序. 效果图: 二.安装Spket 1.去官网(htt ...
- Android Support Library
title: Android Support Library tags: Support Library,支持库 grammar_cjkRuby: true --- DATE: 2016-5-13. ...
- ASP.NET SignalR 高可用设计
在 One ASP.NET 的架构图中,微软将 WebAPI 和 SignalR 归类到 Services 类型与 MVC.Web Forms 同列为一等公民,未来的 ASP.NET 5 尽管还在be ...
- [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)
[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...
- 让Chrome 接管邮件连接,收发邮件更方便了
页面中除了传统的超链接外,还可以将邮箱地址写入<a>标签,意思不表自明,当然是用户点击后就会打开相应的邮件客户端向这个连接指向的邮件地址发邮件. <a href="mail ...
- C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字
C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字 +BIT祝威+悄悄在此留下版了个权的信息说: 上一篇得到了字形贴图及其位置字典(可导出为XML).本篇就利用此贴 ...
- ArcGIS之Cartogram地图变形记
一.地图会说谎 地图作为真实世界的抽象,是“用图说话”最可靠的工具,但是有的时候地图也会撒一些小小的谎言,其中最著名的例子当属美国总统大选.如图1是2012年美国总统大选后网上给出的一个结果图,红色代 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章 继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章 ...
- C/C++预处理指令#define,#ifdef,#ifndef,#endif…
2016年12月29日更新: 今天查看以前文件的时候, 突然发现了#error 这个预处理指令.然后回想一下工作, 发现这个指令使用场景还是很多的.比如: 一个项目的模块儿之多,源文件之大,代码之多, ...