js--浏览器渲染原理

57 阅读3分钟

浏览器进程

浏览器会开启多个进程。如浏览器进程、网络进程、渲染进程,这些进程互相隔离,渲染主线程是浏览器中最繁忙的线程,他要处理的任务包括但不限于如下:解析HTML、css,计算样式,布局,处理图层,执行全局js代码,执行事件处理函数,执行计时器的回调函数...

事件循环是异步的实现方式,单线程是异步的产生原因
浏览器是如何渲染的?

浏览器网络线程接收到html文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染。

渲染分为八个阶段:

1.解析html:解析为DOM树(html里面有的东西)和CSSOM树(css样式) 在解析过程中遇到css解析css,遇到js解析js执行,为了提高解析效率,浏览器在解析前,会启动一个预解析的线程,率先下载html中的外部css文件和外部js文件,如果主线程解析到link位置,外部css文件还没下载解析完,主线程不会等待,会继续解析后续的HTML 但是,主线程解析到script位置,会停止解析HTML,转而等待JS文件下载好,并将全局代码解析执行完成后,才能继续解析HTML。这是因为js代码执行过程可能会修改当前DOM树,所以DOM树的生成必须暂停----这就是JS会阻塞HTML解析的根本原因。第一步完成后,会得到DOM树和CSSOM树,浏览器的默认样式,内部样式,外部样式,行内样式均会包含在CSSOM树中。

2.样式计算 Recalculate Style:

DOM数+CSSOM树=>DOM数。主线程会遍历新的DOM树的每个节点计算出他的最终样式。

3.布局Layout

根据样式结算每个元素的尺寸和位置。生成Layout布局树,布局树里面的元素一定是页面上存在的几何信息,隐藏元素不包含。 Layout树中,内容必须在行盒中,行盒和块盒不能相邻,其中会插入匿名行盒和匿名块盒。

4.分层Layer

主线程会使用一个复杂的策略对整个布局树中进行分层。分层的好处在于,将来某一个层改变后,仅会对该层进行后续处理,从而提升效率

5.绘制Paint

为每一层生成绘制指令。渲染主线程的工作到此为止,剩余步骤交给其他线程。

6.分块 Tiling

将每一层分为多个小区域。主线程将每个图层的绘制信息交给合成线程,剩余工作由合成线程完成。合成线程会对每个图层进行分块,划分为更小的区域。它会从线程池中拿取多个线程来完成分块工作。

7.光栅化

将每个块变成位图(像素点),优先处理靠近视口的块。此过程用到GPU加速

8.画

合成线程计算每个位图在屏幕上的位置,交给GPU呈现