【小结】从输入URL到页面显示发生了什么?(二)渲染

2023-10-30

本文总结从输入URL到页面显示的第二部分内容:渲染(从拿到HTML资源到显示的过程)

在这里插入图片描述

主要过程

  1. 构建DOM树
  2. 样式计算,分成三步
    • 把 CSS 转换为浏览器能够理解的结构–styleSheets
    • 转换样式表中的属性值,使其标准化
    • 计算出 DOM 树中每个节点的具体样式(继承和层叠规则)
  3. 布局:计算出DOM树中可见元素的几何位置。在这个阶段完成两个任务
    • 创建布局树:额外构建一颗值包含可见元素的布局树
    • 布局计算
  4. 对布局树进行分层,并生成分层树:并不是布局树的每个节点都包含一个图层,如果一个节点没有对应的层,那么这个节点就从属于父节点的图层。通常满足下面两点中任意一点的元素就可以被提升为单独的一个图层。
    • 第一点,拥有层叠上下文属性的元素会被提升为单独的一层。(position:fixed;z-index:2;filter:blue(5px);opacity:0.5等等)
    • 第二点,需要剪裁(clip)的地方也会被创建为图层。(滚动条等)
  5. 为每个图层生成绘制列表,并将其提交到合成线程。
  6. 合成线程将图层分成图块,并在光栅化线程池中将图块转换成位图。
    • 合成线程会按照视口附近的图块来优先生成位图,实际生成位图的操作是由栅格化来执行的。所谓栅格化,是指将图块转换为位图。而图块是栅格化执行的最小单位。渲染进程维护了一个栅格化的线程池。通常,栅格化过程都会使用 GPU 来加速生成,使用 GPU 生成位图的过程叫快速栅格化,或者 GPU 栅格化,生成的位图被保存在 GPU 内存中。
  7. 合成线程发送绘制图块命令 DrawQuad 给浏览器进程。
  8. 浏览器进程根据 DrawQuad 消息生成页面,并显示到显示器上。

补充说明

  1. 有了上面介绍渲染流水线的基础,我们再来看看三个和渲染流水线相关的概念——“重排”“重绘”和“合成”。
    • 更新了元素的几何属性(重排):如果你通过 JavaScript 或者 CSS 修改元素的几何位置属性,例如改变元素的宽度、高度等,那么浏览器会触发重新布局,解析之后的一系列子阶段,这个过程就叫重排。无疑,重排需要更新完整的渲染流水线,所以开销也是最大的。
    • 更新元素的绘制属性(重绘):通过 JavaScript 更改某些元素的背景颜色,那么布局阶段将不会被执行,因为并没有引起几何位置的变换,所以就直接进入了绘制阶段,然后执行之后的一系列子阶段,这个过程就叫重绘。相较于重排操作,重绘省去了布局和分层阶段,所以执行效率会比重排操作要高一些。
    • 直接合成阶段:如果更改一个既不要布局也不要绘制的属性,渲染引擎将跳过布局和绘制,只执行后续的合成操作,我们把这个过程叫做合成。如使用了 CSS 的 transform 来实现动画效果,这可以避开重排和重绘阶段,直接在非主线程上执行合成动画操作。这样的效率是最高的,因为是在非主线程上合成,并没有占用主线程的资源,另外也避开了布局和绘制两个子阶段,所以相对于重绘和重排,合成能大大提升绘制效率。

总结: 渲染过程

  1. 构建dom树 根据html文件中标签结构生成dom树 输入: html文件 经过html解析器 输出:树状结构的dom (document可以查看)
  2. 样式计算 输入: css 输出styleSheets
    • 将css(包括外联css.''中的css和元素style属性的行内css)转化为浏览器可以理解的styleSheets (document.styleSheets可以查看)
    • 标准化 统一和标准化表示rem px % 这种不同的单位
    • 计算出 DOM 树中每个节点的具体样式,涉及到 CSS 的继承规则和层叠规则
  3. 布局 输入 dom树和styleSheets 输出: layout布局树
    • 创建布局树: 根据dom树和styleSheets输出一颗只包含可见元素的dom树
    • 布局计算 : 计算完全可见dom树上每个节点的位置
  4. 分层(输入:layout布局树 输出 : layerTree) 针对一些复杂的 3D 变换、页面滚动,或者使用 z-indexing 做 z 轴排序等,为了更加方便地实现这些效果,渲染引擎还需要为特定的节点生成专用的图层,并生成一棵对应的图层树(LayerTree).通常情况下,并不是布局树的每个节点都包含一个图层,如果一个节点没有对应的层,那么这个节点就从属于父节点的图层。
  5. 生成图层绘制指令 (输入:layerTree 输出: 绘制指令列表)
  6. raster栅格化操作(输入: 绘制指令列表 输出:位图): 所谓栅格化是指将图块转换为位图,而图块是栅格化执行的最小单位。
    绘制列表只是用来记录绘制顺序和绘制指令的列表,实际上绘制操作是由渲染引擎中的合成线程来完成的。当图层的绘制列表准备好之后,合成线程会将图层划分为图块。
    然后合成线程会按照视口附近的图块来优先生成位图,实际生成位图的操作是由栅格化来执行的。渲染进程维护了一个栅格化的线程池,所有的图块栅格化都是在线程池内执行的。通常栅格化过程都会使用 GPU 来加速生成,使用 GPU 生成位图的过程叫快速栅格化,或者 GPU 栅格化,生成的位图被保存在 GPU 内存中。
    (渲染进程维护栅格化线程池,在GPU进程中执行栅格化的具体操作,并在GPU进程中存储栅格化之后的位图)
  7. 合成和显示 : 
    一旦所有图块都被光栅化,合成线程就会生成一个绘制图块的命令——“DrawQuad”,然后将该命令提交给浏览器进程。(渲染进程->浏览器进程)
    浏览器进程里面有一个叫 viz 的组件,用来接收合成线程发过来的 DrawQuad 命令,然后根据 DrawQuad 命令,将其页面内容绘制到内存中,最后再将内存显示在屏幕上 (浏览器向GPU进程拿位图来显示)

参考文章:06 | 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?

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

【小结】从输入URL到页面显示发生了什么?(二)渲染 的相关文章

  • CentOS 7 下安装Chrome浏览器

    参考 http www cnblogs com hfyfpga p 6261819 html http blog csdn net johnnyhu90 article details 42127521 如果出现如下错误 curl 7 Fa
  • 如何使用chrome 浏览器自带截屏?

    1 ctrl shift c 2 ctrl shift p 3 输入 capture 4 选择capture full size screenshot 实现截取整个网页
  • 快速制作一个chrome插件

    说在前面 在我日常开发以及娱乐生活中 浏览器是我使用频率较高的一个应用 当我大学拥有第一部电脑开始 之后不论电脑换成什么 以及使用的是什么系统 我的首选浏览器都是Chrome 不仅仅是因为其速度快 更多是它丰富的扩展在吸引我 那么大家有没有
  • webdriver在浏览器中显示版本不对的解决方法

    相信看到这的小伙伴已经安装好了selenium包了 pip3 install selenium 可能是运行的时候出现这样的错误 SessionNotCreatedException Message session not created T
  • 谷歌浏览器Google Chrome离线版(持续更新中)

    谷歌浏览器官方正式版采用自主研发Chromium内核 它是全球受欢迎的谷歌浏览器电脑版 追求速度 隐私安全的网络浏览器 而Google Chrome浏览器离线版更可以在无网络的情况下安装 一 在线版和离线版区别 在线版 即下载官方下载的一个
  • CHROME扩展开发之·消息传递Message(window.message)

    由于content scripts运行在Web页面的上下文中 属于Web页面的组成部分 而不是Google Chrome扩展程序 但是content scripts又往往需要与Google Chrome扩展程序的其他部分通信以共享数据 这可
  • python爬虫学习笔记3

    1 selenium 1 什么是selenium 1 Selenium是一个用于Web应用程序测试的工具 2 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 3 支持通过各种driver FirfoxDriver Iter
  • 解决Chrome, NET::ERR_CERT_AUTHORITY_INVALID

    文章目录 前言 解决方法一 解决方法二 总结 前言 解决方法一 首先清理一下缓存 三个点 gt 设置 gt 清除浏览数据 即可 如果还解决不了 因为Chrome是默认使用HSTS传输 严格的http传输方式 解决方法二 在Chrome浏览框
  • 谷歌Chrome浏览器安装插件Hackerbar

    谷歌Chrome浏览器安装插件Hackerbar 因为google浏览器的应用市场 https chrome google com webstore category extensions 在国内无法访问 所以无法在线安装插件 这里提供开发
  • 解决Android通过chrome://inspect/调试WebView出现 HTTP/1.1 404 Not Found 的问题

    问题描述 无论是调试Web页面还是调试Hybrid混合应用 只要是调试Android的webview 都需要使用Chrome inspect进行调试 但是国内开发者会出现404 Not Found错误 原因解析 国内网络无法访问 https
  • 解决Uncaught SyntaxError: Unexpected reserved word

    解决思路 首先 我运行项目报错 我查看了一下node版本 是否太低 如果是14版本的话 那么node需要升级 目前 node已经升级到19 升级到16即可 无需太高 更新完node版本之后 发现它还是报错 然后接着从网上搜报错 经历无数次的
  • Selenium启动Chrome时配置选项

    Selenium操作浏览器是不加载任何配置的 网上找了半天 关于Firefox加载配置的多点 Chrome资料很少 下面是关于加载Chrome配置的方法 一 加载所有Chrome配置 用Chrome地址栏输入chrome version 查
  • Advanced REST client的使用说明以及安装

    1 为什么要使用REST Client 在实际企业开发过程中经常会有这样的需求 1 我当前开发的这个系统是需要调用其他系统的接口 也就是我们需要频繁的测试接口 尝试不同的入参参数去查看返回结果 如果要在程序中调试就必要不断的改代码 重启to
  • 隐藏selenium的特征

    1 chromedriver exe中的 cdc asdjflasutopfhvcZLmcfl 特征 cdc 是chromedriver exe的一个特征之一 很多网站会通过检测是否有这个特征来判断是否是selenium 解决方案 wind
  • chrome黑暗模式设置

    1 前言 使用Chrome有很久了 但一直没发现有令人满意的黑暗模式 期间试过通过在谷歌商店中安装黑暗主题 但感觉不好 主要有以下 除了chrome的界面是黑暗模式外 打开其它的页面还是亮模式 我希望黑暗模式支持以下特性 chrome的标签
  • CSS 浏览器缩小之后页面错乱 块不见问题

    问题1 浏览器正常100 显示的时候 今日推荐是看得见的 浏览器缩小 小于100 之后 今日推荐被挤不见了 今日推荐块的DIV的CSS原配置是 today recommend py container width 1200px margin
  • windows下搭建编译chromium的开发环境

    本篇为windows下搭建编译chromium的方法 mac篇 mac下搭建编译chromium的开发环境 二七 CSDN博客 linux篇 linux 搭建和编译 chromium 环境 二七 CSDN博客 注意 搭建部署chromium
  • 浏览器主页被篡改360篡改浏览器主页,官方四步最完美解决办法

    以前写过一篇浏览器主页被360篡改成他们的主页的文章 那时真的就是气的直接卸载了360 之后通过修改注册表的方式 将主页修改回来 方法很暴力 由于重做了系统 360又被重新安装了回来 结果和以往一样 我的主页还是被强制修改了 但是这次我冷静
  • Selenium Python 自动化搭建及简单用例编写

    1 首先确定自己的浏览器的当前版本号 2 下载对应版本驱动 http chromedriver storage googleapis com index html 下载完成后直接复制到py的目录下 3 调用 简单三行代码就可以简单实现我们的
  • 雪球股票数据接口

    目录儿 雪球 K线接口 K线对象属性 雪球 K线接口 https stock xueqiu com v5 stock chart kline json symbol SZ300396 begin 1664553600000 period d

随机推荐

  • 【华为OD机试 2023】 优秀学员统计(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • 链表排序居然比数组排序还简单?——leetcode 148 (1)

    链表排序居然比数组排序还简单 leetcode 148 1 在 O n log n 时间复杂度和常数级空间复杂度下 对链表进行排序 示例 1 输入 4 gt 2 gt 1 gt 3 输出 1 gt 2 gt 3 gt 4 示例 2 输入 1
  • Ubuntu18.04_64位系统Package docker-ce is not available, but is referred to by another package.

    1 在 etc apt sources list d docker list文件中添加下面内容 deb arch amd64 https download docker com linux ubuntu bionic stable 2 更新
  • 计算机的内置用户是什么,系统内置的用户和组账户有哪些

    内置普通组 Administrators 属于该administators本地组内地用户 都具备系统管理员地权限 它们拥有对这台计算机最大地控制权限 行的意思可以执行整台计算机地管理任务句号 内置地系统管理员帐房Administrator就
  • AFL 生态圈

    AFL 生态圈 在本文中 我们将讨论的不是经典AFL本身 而是关于为其设计的实用程序及其修改 我们认为 这些实用程序可以显着提高模糊测试的质量 如果你想知道如何提高AFL以及如何更快地找到更多漏洞 继续阅读 什么是AFL 它有什么用 AFL
  • c# .net 微软证书_微软透露C#9.0计划

    c net 微软证书 微软正在努力开发C 9 0 这是对该公司的类型安全的 面向对象的语言的升级 它将包括诸如记录和基于值的平等之类的新功能 C 9 0将成为 NET 5开发平台的一部分 该平台将于11月发布 C 8 0于去年9月发布 C
  • imagemagick使用_使用ImageMagick将图像转换为灰度

    imagemagick使用 A few years ago I bought a DSLR camera with a bunch of filter effects built in and it s been worth every p
  • PyEMD库的安装和导入EMD, Visualisation问题[已解决]

    1 安装问题 直接pip安装可能会报错 error Microsoft Visual C 14 0 or greater is required 有两种方法可以解决 按照提示下载Microsoft C Build Tools并安装 官方下载
  • html网页自动提示框代码,多种网页弹出窗口代码

    经常上网的朋友可能到过这样一些网站 一进入首页立刻会弹出 一个窗口 或者按一个链接或按钮弹出 通常在这个窗口里会显示 一些注意事项 版权信息 警告 欢迎光顾之类的话或者作者想要 特别提示的信息 其实制作这样的页面非常容易 只要往该页面的 H
  • 对于第一阶段学习的总结

    阶段总结 杨芳芳 第一阶段的学习就到此结束了 在这一段时间中 学到了很多以前没有接触过的知识 让我对java有了很大的了解 并且能够自己编写一些小程序了 下面就是我对于在这段期间的学习情况的总结 由于我是开课后从UI转进JAVA来的 刚进来
  • 天翼云登录破解js逆向

    网站 https m ctyun cn wap main auth login redirect 2Fmy 账号 234555551 qq com 密码 fffffffffff 666 抓包分析一下 密码直接加在url后面进行请求 打个xh
  • 阐述篇-聊聊我眼中の《面试宝典》

    相信或许很多人是因为通过搜索面试宝典的文档点进来的 你或许正在忙碌找工作 你或许想在跳槽之前把能量池蓄满 if dev HR 或许你可以花5min看完 求职篇 面试多家公司却总是电话通知 why 面试感觉聊的很好 就是迟迟没有电话 why
  • 游戏开发unity UGUI知识系列:判断是否点击在UI对象上

    EventSystem current IsPointerOverGameObject 检测点击是否在ui上 通常可以用来方便判断是否点击在屏幕上 用来进行镜头左右上下的角度的调整前的判断 需要注意的是 使用EventSystem时 场景里
  • 物理地址 = 段地址*10H + 偏移地址

    程序如何执行 CPU先找到程序在内存中的入口地址 地址总线 8086有20根地址总线 每一根可以某一时传0或1 20位的二进制数字可以表示的不同的数字的个数是2 20 1048576 1048576 byte 1024 1024 KB 注
  • ffmpeg将webm格式转换成mp4

    ffmpeg将webm格式转换成mp4 起因 转换成HEVC编码 H 265 转换成AVC编码 h 264 起因 手头有一部4K风景视频 辛辛苦苦从油管上下载下来 想要用wallpaper engine做成壁纸 却发现格式是webm vp9
  • MAC地址表

    MAC地址表实验 动态AMC地址 通过源mac地址表学习
  • C语言程序设计经典例题----海伦公式求三角形面积

    海伦公式 又译作希伦公式 海龙公式 希罗公式 海伦 秦九韶公式 它是利用三角形的三条边的边长直接求三角形面积的公式 表达式为 S p p a p b p c 以下是这个程序的成功和失败示例 这个程序利用到判断以及求值两个部分 因此我们可以利
  • 树的遍历(概念与习题)

    树的遍历概念 首先我们观察三种遍历方式对根 左 右结点的遍历顺序 先序的遍历顺序 根 左 右 中序的遍历顺序 左 根 右 后序的遍历顺序 左 右 根 遍历顺序可以理解为 优先级 先序遍历举例 若一个节点有左子树和右子树 那它下一步将会先走向
  • SSM框架整合静态资源自动加请求前缀

    静态资源自动加请求前缀 当如js文件在jsp中被引入时 可能请求转发到该页面会js文件报404错误 这是因为js文件路径在项目名与js文件名之间自动加上了请求路径的父级路径 解决方案 在jsp页面顶部以及head标签中加入Java脚本代码如
  • 【小结】从输入URL到页面显示发生了什么?(二)渲染

    本文总结从输入URL到页面显示的第二部分内容 渲染 从拿到HTML资源到显示的过程 主要过程 构建DOM树 样式计算 分成三步 把 CSS 转换为浏览器能够理解的结构 styleSheets 转换样式表中的属性值 使其标准化 计算出 DOM