笔记-浏览器渲染原理

79 阅读2分钟

渲染主线程

1.HTML解析

  • html (parse)====> DOM树,CSSOM树
  • 将html解析为DOM对象与CSS对象,为后续流程做准备,为JS操作dom和样式提供操作空间

HTML解析过程中遇到css代码

--- 为提高效率,浏览器会启动一个预解析器率先下载和解析css

image-20230227100324548.png

HTML解析遇到 JS

渲染主线程遇到JS时会暂停一切行为,等待下载执行完成之后才能继续预解析线程

*因为js代码的执行可能会修改DOM树*

image-20230227100948241.png

2. 样式计算

css的计算过程

CSS属性值的计算过程

  • 层叠
  • 继承

视觉格式化模型

  • 盒模型
  • 包含块
  • BFC

计算后的样式

// computed Style ==> 最终样式 cssom树
/*
p { 
    color: red; ====> color: rgb(250,0,0)
    font-size: 2rem; ===> font-size: 32px
}
*/
将相对值全部转换为绝对值

3.布局

DOM树与Layout树并不一定时一一对应的

例如:伪元素存在与layout树而不存在于dom树, display: none(所有没有几何信息的元素)存在于dom树而不存在于layout树

内容必须在行盒中

行盒与块盒不能乡邻

image-20230227112433780.png

4.分层

主线程中进行,分层元素单独处理

与堆叠上下文有关的属性会影响分层:(z-index,opcity,transform等)

will-change: transform; // 触发浏览器分层

5.绘制

为每层生成绘制指令集,描述绘制内容

其他线程

6.分块Tiling

分块会将每一层分为多个小的区域

image-20230228110138797.png

7.光栅化

将每个块变成位图 浏览器优先处理靠近视口得块

合成线程会将块信息交给GPU进程,GPU进程会开启多个线程来完成光栅化,得到一块一块得位图

image-20230228110756182.png

8.画

合成线程计算出每个位图再屏幕上得位置,交给GPU进行最终呈现

渲染主线程与合成线程存在于沙盒,不能直接与硬件交互

合成线程 ===> GPU进程 ===> 硬件显示