浏览器原理篇—渲染原理

2023-12-21

目录导航

  1. 为什么要学习浏览器的渲染原理
  2. 浏览器的渲染流程
  3. 浏览器的渲染阻塞
  4. 浏览器的渲染优化

为什么要学习浏览器的渲染原理?

  • 知识深度挖掘:
    • 帮助更好地理解前端性能优化。从而对实现效果进行针对性优化。如:**回流和重绘 **渲染机制。
    • 帮助更好地理解浏览器的运行机制。扩展 浏览器原理 方面的知识。
    • debug时可以更快定位问题。当页面出现渲染问题时,如果对浏览器的工作原理有了解,可以根据症状更快定位问题所在。
  • 面试需要(相关面试题):
    • 从输入URL到页面展示,这中间发生了什么?(网络和渲染)
    • 浏览器的渲染过程?
    • 浏览器的渲染优化?
    • 什么情况下会阻塞渲染?
    • 。。。

浏览器的渲染流程

前言

什么是渲染render

渲染就是将html字符串传成可以显示的一个个像素点的过程。
用函数表示:

function render(htmlStr) {
  //转换过程
  return Html;
}

渲染的时间点

当我们输入一个url时, 网络线程会通过网络通信 给我们返回HTML文档,但网络线程不会在对其进行处理。而浏览器在收到这个HTML文档后,会产生一个 渲染任务 ,传递给 主线程的信息队列 。在 事件循环 的作用下, 渲染主线程 开始了 渲染流程
image.png

渲染流水线

整个渲染流程分为多个阶段,分别是:

  1. HTML 解析 (DOM)
  2. 样式计算 (style)
  3. 布局 (layout)
  4. 分层 (layer)
  5. 绘制 (paint)
  6. 分块 (tiles)
  7. 光栅化 (raster)
  8. 绘画 (draw quad)

每个阶段都有明确的输入输出,上一个阶段的输出会成为下一个阶段的输入。
这样,整个渲染流程就形成了一套组织严密的生产流水线。
image.png
image.png

渲染流程

解析HTML(DOM)

渲染的第一步是 解析 HTML 。字符串转对象
image.png
内敛样式,服务器样式,css外链样式,。。。
image.png
可以在浏览器控制台输入,观察一下:

  1. document.styleSheets
  2. document.styleSheets[0].addRule( ‘div’, ‘border:2px solid #f40 !important’)

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

样式计算(style)

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

布局(layout)

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

分层(layer)

下一步是 分层
主线程会使用一套复杂的策略对整个布局树中进行分层。
分层的好处在于,将来某一个层改变后,仅会对该层进行后续处理,从而提升效率。
滚动条、堆叠上下文、transform、opacity 等样式都会或多或少的影响分层结果,也可以通过 will-change 属性更大程度的影响分层结果。
image.png
可以在开发者工具中查看图层,还可以旋转、放大,帮助我们更清晰地查看图层:
https://www.jd.com/
image.png

绘制(paint)

再下一步是 绘制。
主线程会为每个层单独产生绘制指令集,用于描述这一层的内容该如何画出来。
image.png

分块(tiles)

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

光栅化(raster)

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

绘画(draw quad)

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

总结

  1. 渲染进程将 HTML 内容转换为能够读懂的** DOM 树**结构。
  2. 渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets ,计算出 DOM 节点的样式。
  3. 创建 布局树 ,并计算元素的布局信息。
  4. 对布局树进行 分层 ,并生成分层树。
  5. 为每个图层生成 绘制列表 ,并将其提交到合成线程。
  6. 合成线程将图层分成 图块 ,并在光栅化线程池中将图块转换成位图。
  7. 合成线程发送绘制图块命令 **DrawQuad **给浏览器进程。
  8. 浏览器进程根据 DrawQuad 消息 生成页面 ,并 显示 到显示器上。相关概念

重排重绘

上面整个渲染过程:
DOM、Style、layout、layer、paint、tiles、raster、draw quad、display

(1)重排:

修改几何属性,影响layout后面全部;

(2)重绘:

修改绘制属性,影响paint之后;

(3)合成:

1.修改不要布局不要绘制的属性,只影响后续合成操作 tiles后面;性能好;
2.最常见的就是 CSS3 硬件加速(GPU加速),四点
transform: translateZ(0)、opacity、filters、will-change
Will-change提前告诉浏览器元素会发生什么变化;

参考:

https://ke.qq.com/course/5892689/13883868337269329#term_id=106109971

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器原理篇—渲染原理 的相关文章

  • 浏览器Uncaught QuotaExceededError错误(localStorage超出限额)

    Web Storage网络存储 HTML5的Web Storage网络存储是指网络应用程序用于在网络浏览器存储方法和通讯协议 支持持久数据存储 类似于Cookie 以及window local存储 网络存储又分为localStorage本地
  • 详解浏览器渲染原理及流程

    今天来分享一下浏览器的渲染原理及流程 前言 先来看看 Chrome 浏览器的多进程架构 通常 我们打包出来的 HTML CSS JavaScript 等文件 经过浏览器运行之后就会显示出页面 这个过程就是浏览器的渲染进程来操作实现的 渲染进
  • 想在线编程么,这几个在线代码编辑器网站适合你

    今天给大家推荐几个可以在线编程的网站 对于大部分开发者可能会不屑使用在线的网站 认为在自己电脑安装环境不是很简单的事情么 但是你很有可能临时需要一台电脑去测试一段简单的代码 也有可能想要分享一段代码给别人 也有可能你想要学习很多语言 又不想
  • 如何屏蔽百度搜索推广

    这几天大家都在说百度推广的事 笔者没什么好说的 毕竟已经很久没有见过百度推广了 不过说实话 很多时候谷歌搜出来的东西才是我想要的 今天就讲一下如何使用插件屏蔽百度推广 一 工具 1 chrome浏览器 2 Tampermonkey 插件 c
  • 坑爹的铁路在线订票系统

    2012年的春运订票时间比往年提前了一点点 12天 这样 明天我就可以订回家的票了 上午起床 在 cnBeta 看到这篇报道 记者体验网购火车票 2小时订票10多次全失败 我靠 这么不靠谱 迅速登上 12306 cn 验证 果然遇到了报道的
  • 浏览器web播放rtsp视频流解决方案(chrome/IE/firefox/360等)

    代码中的具体参数含义 大家可以移步这里 https wiki videolan org Documentation WebPlugin 找半天 HTML5的可以支持RTMP 但是无法播放RTSP flash也止步于RTMP 最后同事推荐了个
  • 浏览器的工作原理

    浏览器可以被认为是使用最广泛的软件 本文将介绍浏览器的工 作原理 我们将看到 从你在地址栏输入google com到你看到google主页过程中都发生了什么 将讨论的浏览器 今天 有五种主流浏览器 IE Firefox Safari Chr
  • 一分钟解决Chrome浏览器主页被hao123、360和2345篡改简单有效方法

    当你打开浏览器看到各种首页跳转的页面 对于强迫症的我是不能接受的 各种情况都碰到了 现在给出解决方法 按照下面的方式去排查就可以一定能解决你的问题 如果不行的话你来打我呀 如果问题解决了希望你能推荐给其他人 提示 检查下杀毒软件有没有绑定浏
  • 定制浏览器

    定制浏览器 http www vcmain com helloworld archive 11310 html helloworld 发表于 2008 9 29 14 52 00 阅读数 8 定制浏览器 作者 冯明德 浏览器控件是个典型的A
  • 在Web上运行Linux

    原文地址 http coolshell cn articles 4722 html more 4722 一个叫Fabrice Bellard的程序员写了一段Javascript在Web浏览器中启动Linux 原网页 我把这个网页iframe
  • 用apache实现禁止IP段或者主机对某个目录的访问

    Allow 指令 说明 控制哪些主机能够访问服务器的一个区域 语法 Allow from all host env env variable host env env variable 上下文 目录 htaccess 覆盖项 Limit 状
  • please remember me(auto login)

    记住我 用户自动登录的实现 auto login 一 什么是用户自动登录 对于我们的网站向已注册用户提供某些专门的服务 比如网上购物 在线下载 收费浏览等等 就会要求用户在使用这些服务之前进入登录页面 输入用户名和密码 并进行验证 如果用户
  • 开发浏览器扩展程序(js脚本)

    一 打开谷歌浏览器扩展程序 二 打开 开发者模式 三 加载已解压的扩展程序 四 选择编写好的脚本文件夹 看不到文件 没关系 默认会加载 manifest json 文件 实际文件夹内容 五 加载成功 六 开始编辑脚本文件 name 扩展名字
  • 修复ie浏览器主页被360篡改

    一 环境 win10 二 问题 打开ie浏览器 发现主页被360篡改了 360我没有装过 怀疑是其他软件修改的 分析 浏览器主页被篡改 一般都是注册表被修改了 或者是启动程序里面有加载篡改主页 首先 看是否启动程序里面有加载篡改了主页 用右
  • 深入理解浏览器缓存机制 ( http )

    一 介绍 http缓存 浏览器根据当前http请求报文策略 将网路资源存储到本地内存 memory cache 硬盘 disk cache 中 缓存流程 浏览器 浏览器缓存 服务端 发起请求 根据缓存
  • 如何编译火狐浏览器的源代码

    以下摘录于 http zhidao baidu com question 33214960 html 源代码编译安装Firefox linux下 http forums mozine cn index php showtopic 601 W
  • 把路由器设置为交换机或者二级路由设置联网

    五台电脑用了一个路由 还有一台没有连上 结果又买了一个路由 问问能把剩下的电脑接上吗 该怎么接法 1 做二级路由 把第二個路由器作为二级路由用 接线的方法就像你接第一个主路由器那样 从第一个路由器LAN口出来的一条网线接在第二个路由器的WA
  • JS字符串替换函数全部替换方法

    color olive JS字符串替换函数 Replace 字符串1 字符串2 1 我们都知道JS中字符串替换函数是Replace 字符串1 字符串2 但是这个函数只能将第一次出现的字符串1替换掉 那么我们如何才能一次性全部替换掉了 将上面
  • 浏览器的事件循环机制(Event loop)

    事件循环 浏览器的进程模型 何为进程 程序运行需要有它自己专属的内存空间 可以把这块内存空间简单的理解为进程 每个应用至少有一个进程 进程之间相互独立 即使要通信 也需要双方同意 何为线程 有了进程后 就可以运行程序的代码了 运行代码的 人
  • 浏览器原理篇—渲染原理

    目录导航 为什么要学习浏览器的渲染原理 浏览器的渲染流程 浏览器的渲染阻塞 浏览器的渲染优化 为什么要学习浏览器的渲染原理 知识深度挖掘 帮助更好地理解前端性能优化 从而对实现效果进行针对性优化 如 回流和重绘 渲染机制 帮助更好地理解浏览

随机推荐

  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • WinSync.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个WinSync
  • 达芬奇18.6DaVinci ResolveStudio(Win/Mac)激活版

    DaVinci Resolve Studio 18是一款业界领先的视频后期制作软件 它集成了剪辑 调色 视觉特效 动态图形和音频后期制作等功能 为用户提供了完整的创作解决方案 该软件不仅适用于电影 电视和网页内容的制作 还广泛应用于广告 纪
  • 小程序模版|报名管理服务源码

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • Python 元组完全指南 1

    元组用于在单个变量中存储多个项目 mytuple apple banana cherry 元组是 Python 中的 4 种内置数据类型之一 用于存储数据集合 另外还有列表 集合和字典 它们都具有不同的特性和用途 元组是有序且不可更改的集合
  • WinSyncProviders.dll文件丢失导致程序无法启动问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个WinSync
  • 测试报告和结果分析 —— allure整合pytest生成测试报告

    一 生成HTML测试报告的三种方式 1 unittest和HTMLTestRunner整合 2 allure和pytest整合 3 Jenkins中安装allure插件 Jenkins安装插件出错 不能正常使用 二 allure整合pyte
  • F5创新产品赢得2023年众多全球知名奖项

    西雅图 2023年12月20日 全球多云应用安全和应用交付服务领导者F5 NASDAQ FFIV 日前宣布 公司在2023年斩获多项杰出荣誉 这些殊荣充分彰显了F5在潜心创新和追求卓越方面始终坚守的承诺 同时凸显了公司正在专注于利用更先进的
  • 浅谈小程序开源业务架构建设之路

    一 业务介绍 1 1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态 我们的愿景是 定义移动时代最佳体验 建设智能小程序行业标准 打破孤岛 共建开源 开放 繁荣的小程序行业生态 百度智能小程序的生态玩家有三类 分
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • std::string 转为 LPCTSTR类型

    在串口通讯中使用CreateFile 时 第一个参数类型为 LPCTSTR 通常使用的string类型需要进行转换 HANDLE CreateFile LPCTSTR lpFileName 指向文件名的指针 DWORD dwDesiredA
  • winrscmd.dll文件缺少导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个winrscm
  • 互操作性(Interoperability)如何影响着机器学习的发展?

    互操作性 Interoperability 也称为互用性 即两个系统之间有效沟通的能力 是机器学习未来发展中的关键因素 对于银行业 医疗和其他生活服务行业 我们期望那些用于信息交换的平台可以在我们需要时无缝沟通 我们每个人都有成千上万个数据
  • winsockhc.dll文件缺少导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个winsock
  • SpringBoot代码混淆与反混淆加密工具详解

    目录 反编译 混淆 正文 一共就两步 无需源码 直接对ipa文件进行混淆加密 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 简单就是把代码跑一哈 然后我们的代码 java文件 就被编译成了 class 文件
  • 38条Web测试经验分享

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 详解数据科学自动化与机器学习自动化

    过去十年里 人工智能 AI 构建自动化发展迅速并取得了多项成就 在关于AI未来的讨论中 您可能会经常听到人们交替使用数据科学自动化与机器学习自动化这两个术语 事实上 这些术语有着不同的定义 如今的自动化机器学习 即 AutoML 特指模型构
  • winrssrv.dll文件缺少导致程序无法启动问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个winrssr
  • RPA机器人助力义务教育招生随机派位系统

    作为一名教育行业从业者 我深切地感受到招生工作中的繁琐和低效 每年招生季 我们需要处理大量的报名信息 进行筛选和录取工作 然而 由于人力资源有限 往往会出现疏漏和错误 给招生工作带来了不小的困扰 幸运的是 我们发现了八爪鱼RPA这一强大的工
  • 浏览器原理篇—渲染原理

    目录导航 为什么要学习浏览器的渲染原理 浏览器的渲染流程 浏览器的渲染阻塞 浏览器的渲染优化 为什么要学习浏览器的渲染原理 知识深度挖掘 帮助更好地理解前端性能优化 从而对实现效果进行针对性优化 如 回流和重绘 渲染机制 帮助更好地理解浏览