浏览器的渲染原理?

什么是浏览器渲染?

浏览器的渲染就是把一个html的字符串,渲染成为一个页面。

浏览器是怎么渲染的呢?

(网络线程,html文档,渲染任务,渲染主线程,消息队列,事件循环)

当浏览器的网络线程拿到HTML文档后,会产生一个渲染任务,并将其传递渲染主线程消息队列。在事件循环的机制作用下,渲染主线程取出消息队列的渲染任务进行渲染流程。

渲染流程?

HTML解析、样式计算、布局、分层、绘制、分块、光栅化、画 。

1、HTML解析:parse

遇到css解析css,遇到JS执行JS。
CSS解析会放在预解析进程不会阻塞HTML解析,JS 会阻塞HTML的解析,当网络线程下载完JS才会继续解析HTML,最后生成DOM树,和CSSOM树。

1.CSS的解析
HTML解析图

  1. JS的执行

在这里插入图片描述

2、样式计算:style

主线程会遍历DOM树,为树上的每个节点计算出它最终的样式。(很多预设值会变成绝对值,red变成rgb(255,0,0),相对单位会变成绝对单位,em变成px,)

3、布局:Layout

布局阶段会一依此遍历DOM树的每一个节点计算每个节点的几何信息。例如节点的宽高,相对包含块的位置,大部分时候DOM树和布局树并非一一对应,比如display:none的节点没有几何信息,因此不会生成布局树,又不如伪元素选择器,匿名行盒,匿名块盒等等。

4、分层:Layer

主线程使用一套复杂的策略对应整个布局树种进行分层。
分层的好处是将来某一层改变后,仅仅会对该层进行后续处理,从而提高效率。
滚动条,堆叠上下文,transform,opacity,等样式都会或多或少的影响分层结果,也可以will-change属性更大程度的影响分层结果。

5、绘制-paint

绘制指令集,用于描述这一层的内容该如何画出来。

6、分块-Tiling

完成绘制后,主线程将每个图层的绘制信息提交给合成线程,合成线程将对每个图层进行分块,将其划分为更多的小区域。

6、光栅化-Raster

将每个块变成位图,优先处理靠近视口的块。
GPU进程开启多个线程进行光栅化

7、画-Draw

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

记录:渲染进程(沙盒)
        渲染主进程
        合成线程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值