当前位置: 首页 > news >正文

浏览器渲染过程

渲染过程如下图:


解析 HTML

解析 HTML 得到 DOM 树;解析 CSS 得到 CSSOM 树

解析前:

启动一个预解析的线程,率先下载 HTML 中的外部 CSS 文件和外部的 JS 文件,这样可以提高解析效率

解析时:

解析到 link 位置(遇到 CSS 代码),此时外部的 CSS 文件还没有下载解析好,主线程不会等待,继续解析后续的 HTML
CSS 不会阻塞 HTML 解析,就是因为下载和解析 CSS 的工作是由预解析线程和网络线程进行的

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

样式计算


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

布局

依次遍历 DOM 树的每一个节点,计算每个节点的几何信息。例如节点的宽高、相对包含块的位置

布局完成会得到布局树。大部分时候,DOM 树和布局树并非一一对应,比如 display:none 的节点没有几何信息,就不会生成到布局树。又或者使用了伪元素选择器,虽然 DOM 树中不存在这些伪元素节点,但它们拥有几何信息,所以会生成到布局树中。还有就是匿名行盒、匿名块盒等等都会导致 DOM 树和布局树无法一一对应

分层

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

滚动条、堆叠上下文、transform、opacity 等样式都会或多或少的影响分层结果,也可以通过 will-change 属性更大程度的影响分层结果

绘制

主线程会为每个层单独产生绘制指令集,用于描述这一层的内容该如何画出来。绘制完成后,主线程将每个图层的绘制信息提交给合成线程,剩余工作将由合成线程完成

分块


合成线程首先对每个图层进行分块,将其划分为更多的小区域,它会从线程池中拿取多个线程来完成分块工作

光栅化

目的:将每个块变成位图

合成线程会将块信息交给 GPU 进程,以极高的速度完成光栅化。GPU 进程会开启多个线程来完成光栅化,并且优先处理靠近视口区域的块
结果:得到一块一块的位图

合成线程拿到每个层、每个块的位图后,生成一个个「指引(quad)」信息。指引会标识出每个位图应该画到屏幕的哪个位置,以及会考虑到旋转、缩放等变形。然后合成线程会把 quad 提交给 GPU 进程,由 GPU 进程产生系统调用,提交给 GPU 硬件,完成最终的屏幕成像


transform 效率高的根本原因
transform 既不会影响布局也不会影响绘制指令,它影响的只是渲染流程的最后一个 draw 阶段。而 draw 在合成线程中,所以 transform 的变化几乎不会影响渲染主线程

http://www.dtcms.com/a/310365.html

相关文章:

  • VSCode Python 与 C++ 联合调试配置指南
  • web前端第一次作业
  • TwinCAT3编程入门2
  • 如何快速给PDF加书签--保姆级教程
  • TCP协议的特点和首部格式
  • 电力系统与变压器实验知识全总结 | 有功无功、同步发电机、短路空载实验、电压调整率、效率条件全讲透!
  • curl命令使用
  • 蒙特卡罗方法(Monte Carlo Method)_学习笔记
  • 【面板数据】全国31省名义、实际GDP及GDP平减指数数据(2000-2024年)
  • VR拍摄的流程与商业应用,实用的VR拍摄技巧
  • 汇川ITS7100E触摸屏交互界面开发(二)界面开发软件使用记录
  • python试卷01
  • Cesium性能优化
  • 代码随想录刷题Day22
  • 如何利用API接口与网页爬虫协同进行电商平台商品数据采集?
  • Java应用服务器选型指南:WebLogic vs. Tomcat、WebSphere、JBoss/Wildfly
  • 今日行情明日机会——20250801
  • Linux系统磁盘未分配的空间释放并分配给 / 根目录的详细操作【openEuler系统】
  • 电脑的时间同步电池坏掉了,每次开机都要调整时间
  • 【RocketMQ】鉴权机制
  • 网络协议之路由是怎么回事?
  • 电商项目_性能优化_数据同步
  • 18.若依框架中的xss过滤器
  • Java 24 新特性解析与代码示例
  • 牛客——取数游戏2
  • UE5 动态扫描波
  • 【C#学习Day15笔记】拆箱装箱、 Equals与== 、文件读取IO
  • iPhone查看App日志和系统崩溃日志的完整实用指南
  • 深入理解C语言指针:从回调函数到数组指针笔试题全解析(下)
  • 遥控器信号捕获