浏览器渲染原理

浏览器是如何渲染页面的

当浏览器的网络线程收到HTML文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列
在事件循环机制的作用下,渲染主线程取出消息队列中渲染任务,开启渲染流程
整个渲染流程分为多个阶段:HTML解析(parse),样式计算(style),布局(layout),分层(layer),绘制(paint),分块(tiling),光栅化(raster),画(draw)
每个阶段都有明确的输入输出,上一阶段的输出会成为下一阶段的输入
这样整个渲染流程就形成了一套组织严密的生产流水线

渲染的第一步是解析HTML,解析过程中遇到CSS解析CSS,遇到JS执行JS,为了提高解析效率,浏览器在开始解析前,会启动一个预解析的线程,率先下载HTML中的外部CSS文件和外部的JS文件

如果主线程解析到位置,此时外部的CSS文件还没有下载解析好,主线程不会等待,继续解析后续的HTML,这是因为下载和解析CSS的工作是在预解析线程中进行的,这就是CSS不会阻塞HTML,解析的根本

如果主线程解析到script位置会停止解析HTML,转而等待JS文件下载好,并将全局代码解析执行完成后,才继续解析HTML,这是因为JS代码的执行过程可能会修改当前的DOM树,所以DOM树的生成必须暂停。这就是JS会阻塞HTML解析的根本原因

第一步完成后会得到DOM树和CSSOM树,浏览器的默认样式,内部样式,外部样式,行内样式均会包含在CSSOM树中

样式表:

渲染的第二步是样式计算
主线程会遍历得到的DOM树,依次为树中的每一个节点计算出它最终的样式,称之为Computed Style
在这一过程中很多预设值会变成绝对值,比如red变成rgb(255,0,0),相对单位会变成绝对单位,比如em会变成px

渲染主线程遇到JS时必须暂停一切行为,等待下载执行完后才能继续预解析线程可以分担一点下载JS的任务

第三步是布局,布局完成后会得到布局树
布局会依次遍历DOM树上的每一个节点,计算每一个节点的几何信息。列入节点的宽高,相对包含块的位置
大部分时候,DOM树和布局树并非一一对应
比如display:none的节点没有几何信息,因此不会生成到布局树,比如使用了伪元素选择器,虽然DOM树中不存在这些伪元素节点,但它们拥有几何信息,所以会生成到布局树中,还有匿名行盒,匿名块盒等等都会导致DOM树和布局树无法一一对应

包含块即标签的活动位置
第四步是分层
主线程会使用一套复杂的策略对整个布局树中进行分层
分层的好处在于,将来某一层改变后,仅会对该层进行后续处理,从而提升效率
滚动条,堆叠上下文,transform,opacity等样式都会或多或少的影响分层结果,也可以通过will-change属性更大程度的影响分层结果

第五步是绘制
主线程会为每层单独产生绘制指令集,用于描述这一层的内容该如何画出来(指令:例如将笔移动到某某位置,画一个20*200的矩形,使用红色填充)
完成绘制后主线程将没个图层的绘制信息提交给合成线程,剩余工作将由合成线程完成

第六步是分块
合成线程首先对每个图层进行分块将其划分为跟多的小区域
他会从线程池中拿取多个线程来完成分块工作

第七步进入光栅化阶段
合成线程会将块信息交给GPU进程,以极高的速度完成光栅化
GPU进程会开启多个线程来完成光栅化,并且优先处理靠近视口区域的块
光栅化的结果就是一块一块的位图

最后一步是画
合成线程拿到每个层,每个块的位图后,生成一个个指引信息
指引会标识出每个位图应该划到屏幕的那个位置,以及会考虑到旋转,缩放等变形
变形发生在合成线程,预渲染主线程无关这就是transfor效率高的本质原因
合成线程会把quad提交给GPU进程,由GPU进程产生系统调用,提交给GPU硬件完成最终的屏幕成像

什么是reflow?

reflow的本质就是重新计算layout布局树
当进行了会影响布局树的操作后,需要重新计算布局树,会引发layout
为了避免连续的多次操作导致布局树反复计算,浏览器合并这些操作,当JS代码全部完成后再进行统一计算,所以,改动属性造成的reflow是异步完成的,也同样因为如此,当JS获取布局属性时,就可能造成无法获取到最新的布局信息
浏览器在反复权衡下,最终决定获取属性立即reflow

什么是repaint?
repaint的本质树重新根据分层信息计算绘制指令
当改动了可见样式后,就需要重新计算,会引发repaint
由于元素的布局信息也属于可见样式,所以reflow一定会引起repaint

为什么transform效率高?
因为transform既不会影响布局也不会影响绘制指令,它影响的只是渲染流程的最后一个draw阶段
由于draw阶段在合成线程中,所以transform的变化几乎不会影响渲染主线程,反之渲染主线程无论如何忙碌,也不会影响transform的变化

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值