浏览器多进程,每打开一个 tab 就多一个进程,browser 进程 浏览器的主进程 只有一个
GPU 进程:最多一个,用于 3D 绘制等
浏览器渲染进程(浏览器内核)(Renderer 进程,内部是多线程的
[页面的渲染,JS 的执行,事件的循环] 都在这个进程里,默认每个 Tab 页面一个进程,互不影响,主要作用为 页面渲染,脚本执行,事件处理等
渲染进程内部是有多线程的看看哪些线程吧
由于 JS 的单线程关系,所以这些待处理队列中的事件都得排队等待 JS 引擎处理(当 JS 引擎空闲时才会去执行)
传说中的 setInterval 与 setTimeout 所在线程,为什么要单独的定时器线程?因为 JavaScript 引擎是单线程的,如果处于阻塞线程状态就会影响记计时的准确,因此很有必要单独开一个线程用来计时。
在 XMLHttpRequest 在连接后是通过浏览器新开一个线程请求,将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中。再由 JavaScript 引擎执行。
WebWorker 只属于某个页面,不会和其他页面的 Render 进程(浏览器内核进程)共享,所以 Chrome 在 Render 进程中(每一个 Tab 页就是一个 render 进程)创建一个新的线程来运行 Worker 中的 JavaScript 程序。
SharedWorker 是浏览器所有页面共享的,不能采用与 Worker 同样的方式实现,因为它不隶属于某个 Render 进程,可以为多个 Render 进程共享使用,sharedWorker 由单独的进程管理, WebWorker 只是属于 render 进程下的一个线程。
但会阻塞 render 树渲染(渲染时需等 css 加载完毕,因为 render 树需要 css 信息)
GPU 中每个复合图层是单独绘制的 所以不相互影响,普通文档流内可以理解成一个复合图层 这里称为默认复合层,里面不管添加多少元素,其实都是在同一个复合图层中),absolute fixed 布局 脱离文档流 还在这个复合图层。
通过硬件加速,声明一个新的复合图层 他会单独分配资源, 当然也会脱离文档流,这样这个复合图层怎么改变,也不会影响默认复合层的重排重绘。
硬件加速
最常用的方式:translate3d、translateZ,opacity 属性/过渡动画(需要动画执行的过程中才会创建合成层,动画没有开始或结束后元素还会回到之前的状态),<video><iframe><canvas><webgl>等元素
其它,譬如以前的 flash 插件
absolute 虽然脱离文档流 但是仍然在默认复合层内,就算 absolute 中信息改变时不会改变普通文档流中的 render 树,但是浏览器最终绘制的时候还是会整个复合层绘制,所以 absolute 中信息的改变,仍然会影响整个复合层的绘制。
硬件加速是在另一个复合层中,他的信息改变不会引起原来的复合层改变(当然,内部肯定会影响属于自己的复合层)仅仅是引发最后的合成(输出视图)
一般一个元素开启硬件加速后会变成复合图层,可以独立于普通文档流中,改动后可以避免整个页面重绘,提升性能量,但是不要大量使用复合图层,否则由于资源消耗过度,页面反而会变的更卡
JS 中分为两种任务类型:macrotask 和 microtask 在 ECMAScript 中,microtask 称为 jobs,macrotask 可称为 task,macrotask 中的事件都是放在一个事件队列里面,是由事件触发线程维护。
可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)
microtask 中所有微任务都是添加到微任务队列中,等待当前 macrotask 执行完毕后 这个队列由 js 引擎线程自己维护
microtask:Promise,process.nextTick 等
macrotask:主代码块,setTimeout,setInterval 等(可以看到,事件队列中的每一个事件都是一个 macrotask)

