浏览器是如何渲染页面的

浏览器是个极其复杂的程序,这里只是挑几个和前端息息相关的重要内容来说
在学习如何渲染之前需要知道一个浏览器浏览器会有多个进程,其中主要进程有浏览器进程,网络进程,渲染进程这里我们主要学习内容就发生在渲染进程。当渲染进程启动后会开启一个渲染主线程用来执行HTML,CSS,JS代码,每打开一个新标签页都会新加一个渲染主线程来保证每个标签页互不干扰。

渲染时间点

当网络线程接收到一个HTML后会生成一个渲染任务放到消息队列排队,在事件轮询的机制下,渲染主线程会取出渲染任务执行,至此渲染流程开始。
在这里插入图片描述

渲染流水线

渲染流程又分为多个阶段解析HTML,计算样式,布局,分层,绘制,分块,光栅化,画。
每个阶段都有明确的输入和输出,上一步的输出会作为下一步的输入,这样环环相扣就形成了一条完整的渲染流水线。
在这里插入图片描述

解析HTML

渲染的第一步是解析 HTML来生成dom,cssom树,生成树的原因是为了方便后续操作,不然一直在HTML字符串取值是一个很痛苦的事情。
解析过程中遇到js执行js,遇到css解析css。为了提高效率浏览器会开启一个预解析线程,率先下载HTML中的外部css和js文件。
解析到link位置时css文件还没下载好主线程不会等待,继续解析后面的HTML这是因为css下载是在预解析线程完成的,这也是css不会阻塞HTML解析的根本原因。
解析到script位置时,会停止解析HTML转而去等待js文件下载完成,且全局解析执行完成后,才会继续解析HTML。因为js在执行过程中会改变DOM树,所以 DOM 树的生成必须暂停。这就是js会阻塞HTML解析的根本原因
在这里插入图片描述

样式计算

主线程会遍历得到的DOM树,依次为树的每个节点计算出最终样式,也叫做computed style。
在这一过程中,会把预设值变为绝对值,比如red转换为rgb(255,0,0),em转换为px等,最后会得到一个带有样式的DOM树。
在这里插入图片描述

布局

主线程会依次遍历DOM树,计算出每一个节点的几何信息列如宽高,相对于包含块的位置等等。
之后浏览器会用layout树来保存这些几何信息(layout树并不是js里的树是浏览器内部的)。往往DOM树和layout树并不一一对应,比如display:none;的节点就不会有任何几何信息,又比如使用伪类,虽然DOM树没有这些节点,但是这些节点是有几何信息的,还有匿名行盒,块盒这些都会导致DOM树和layout树并不一一对应。
在这里插入图片描述

分层

主线程使用一套复杂的逻辑进行分层。
这样带来的好处就是,将来某一层内容变化后只用改变当前层,从而提高效率。
滚动条,堆叠上下文,opacity 等都可以影响分层,也可以使用will-change更大程度的影响分层结果。
使用chrome浏览器f12点击图层就可以看到当前页面的分层
在这里插入图片描述

绘制

主线程会为每一层生成指令集,用于描述这一层如何画出来。
在这里插入图片描述

分块

绘制完成后,接下来会交给合成线程来处理,合成线程会把每一层进行分块处理,分成更小的区域,
分块过程会启用多个线程来处理。
在这里插入图片描述
在这里插入图片描述

光栅化

接下来会交给GPU进程处理,优先处理靠近视图窗口的块,处理后的结果就是一个个位图。(此过程会⽤到 GPU 加速
)
在这里插入图片描述

合成线程拿到每个块后会生成一个个 quad(指引)信息。
指引会标记出每个位图应该画到屏幕的某个位置,还会考虑缩放,旋转,变形等。
变形发生在合成线程说于主线程无关,之所以transform效率高也是因为于此。
合成线程会把quad交给GPU进程,再由GPU进程交给GPU硬件处理,最后画到了屏幕上。
在这里插入图片描述

完整过程

在这里插入图片描述
网络线程接收到一个HTML会添加一个渲染任务到消息队列,后经过事件轮询主线程会取出执行渲染任务开启渲染流程,渲染流程分为多个阶段
解析HTML:解析css,执行js生成DOM,CSSOMS树。
计算样式:遍历DOM树计算出最终样式,生成一个带有样式的DOM树。
布局:遍历DOM树生成几何信息的layout树,layout树和DOM树通常不一一对应。
分层:为了提高效率使用一套复杂的策略分层,滚动条,transform都会影响分层,will-change会更大程度的影响分层结果。
绘制:为每一层生成指令集,用于描述如何画出它。
到这里主线程已处理完毕接下来交给其他线程处理
分块:接下来由合成线程会使用多个线程,把每一层分成更小的区域。
光栅化:会使用GPU进程把每个块生成位图。
画:合成线程拿到块层后生成一个个指引之后交给GPU线程,GPU线程产生系统调用,交给GPU硬件显示到屏幕上。

面试题

看完以上浏览器是渲染页面的全流程,那么下面的几道经典面试题也就迎刃而解了。不懂得可以多看几遍流程加深理解。
什么是 reflow(回流)?
回流的本质就是重新计算layout树 ,浏览器为了尽可能减少reflow和repaint操作,会合并这些操作等到js全部执行完成后再去重新计算,所以回流改变是异步的。
那么什么时候会产生同步的layout呢?
当 JS 获取布局属性时,比如getComputedStyle()或currentStyle、offsetTop、offsetLeft、offsetWidth、offsetHeight等等。因为异步会导致获取到错误的值,浏览器在反复权衡下,最终决定获取属性立即 reflow。
什么是 repaint(重绘)?
repaint的本质就是根据分层信息计算了绘制指令。
当改动了可见样式后就会触发重绘。
由于布局样式也是可见样式所以reflow一定会触发repaint。
为什么transform效率高
因为transform不涉及到reflow和repaint,它只影响最后一个画的阶段所以效率高。
由于画(draw)阶段在合成线程中所以几乎不影响主线程,反之主线程哪怕在忙也不会影响到transform的变化。

有问题的地方还请大佬及时指出我会及时修改谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【解决openGauss无法使用gs_check等服务器端命令问题】

【解决openGauss无法使用gs_check等服务器端命令问题】 一、问题描述二、问题原因三、解决方法 一、问题描述 [ommopengauss03 ~]$ gs_check -i CheckCPU Parsing the check items config file successfully [GAUSS-53026]: ERROR: Execute SSH command on host 192.168.56.19…

给出一句话来描述想要的图片,就能从图库中搜出来符合要求的

介绍 地址:https://github.com/mazzzystar/Queryable The open-source code of Queryable, an iOS app, leverages the OpenAIs CLIP model to conduct offline searches in the Photos album. Unlike the category-based search model built into the iOS Photos…

项目使用PowerJob

新一代的定时任务框架——PowerJob 简介 PowerJob是基于java开发的企业级的分布式任务调度平台,与xxl-job一样,基于web页面实现任务调度配置与记录,使用简单,上手快速,其主要功能特性如下: 使用简单&…

如何在 Windows 上从电脑硬盘恢复照片

如今,随着相机设备的普及,您可以轻松地一次拍摄一堆照片,将它们传输到硬盘上,然后再拍摄更多照片。但是,如果您的所有照片意外丢失在驱动器中怎么办?你能恢复它们吗? 在本指南中,我…

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序,它不会往源驱上写任何东西,也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、…

postgresql可视化导入csv文件

不需要在命令行copy了,只需简单点几下 1.在数据库下建一个schema 右击选中数据库-new schema 2.双击你创建的schema,出现tables 3.右击tables,选择import wizard 4.选择你想导入的文件格式,之后一直next 5.选择你的文件所在位置…

C语言实用第三方库Melon开箱即用之多线程模型

在之前的文章中(开发利器——C 语言必备实用第三方库),笔者介绍了一款Linux/UNIX下C语言库Melon的基本功能,并给出了一个简单的多进程开箱即用的例子。 本文将给大家介绍Melon中多线程的使用方法。 在Melon中有三种多线程模式&a…

Redis 之父锐评 LLM 编程:全知全能 Stupid|一周IT资讯

阿里通义千问上线“科目三”,刘皇叔、奥特曼、马斯克通通没逃过 在刚到的2024年,阿里通义千问 APP 上线图片生成舞蹈功能,用户只需输入一张图片,就能生成爆款舞蹈图片。 不管是“科目三”,还是鬼步舞、兔子舞&#x…

(18)Linux 实现简易版shell

前言:做一个 "会创建,会终止,会等待,会程序替换" 的简易 shell 。 1、显示提示符和获取用户输入 shell 本质就是个死循环,我们不关心获取这些属性的接口,如果要实现 shell: 1&…

015:JS之正则表达式,web乱码和路径问题总结,MVC架构模式

一 JS的正则表达式 1 正则表达式简介 正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。 语法 var pattnew RegExp(pattern,modifiers);//正则的格式模版,修饰符或者更简单的方式:var pa…

权威测评首家通过!亚信安慧AntDB通过中国信通院数据库迁移工具专项测试

近日,亚信安慧数据库数据同步平台在中国信通院第17批“可信数据库”数据库迁移工具专项测试中,完全符合《数据库迁移工具能力要求》,成为首家通过标准测试的产品。这一成果标志着湖南亚信安慧科技有限公司(简称“亚信安慧”&#…

Pandas透视表及应用

Pandas 透视表概述 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等。所进行的计算与数据跟数据透视表中的排列有关。 之所以称为数据透视表,是因为可以动态地改变它们的版面布置&#xf…

Git保姆级安装教程

Git保姆级安装教程 一、去哪下载二、安装2.1 具体安装步骤2.2 设置全局用户签名 一、去哪下载 1、官网(有最新版本):https://git-for-windows.github.io/ 2、本人学习时安装的版本,链接:https://pan.baidu.com/s/1uAo…

Spark内核解析-数据存储5(六)

1、Spark的数据存储 Spark计算速度远胜于Hadoop的原因之一就在于中间结果是缓存在内存而不是直接写入到disk,本文尝试分析Spark中存储子系统的构成,并以数据写入和数据读取为例,讲述清楚存储子系统中各部件的交互关系。 1.1存储子系统概览 …

LabVIEW开发分布式光纤油气管道泄漏检测及预警系统

LabVIEW开发分布式光纤油气管道泄漏检测及预警系统 随着油气工业的发展,管道泄漏成为一个严峻的安全问题。本文介绍了一种基于LabVIEW的分布式光纤油气管道泄漏检测及预警系统的设计思路和组成结构。系统包括硬件和软件两部分,其中硬件部分详细阐述了分…

redis报错:Creating Server TCP listening socket 127.0.0.1:6379: bind: No error

Redis启动时报错: Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 这个错误说明已经开启了redis,并且已经占用了端口6379,需要停止redis后再开启。 redis-cli.exeshutdownexitredis-server redis.windows.conf 参考…

java每日一题——输出星星塔(答案及编程思路)

前言: 打好基础,daydayup! 题目:请编写输出如下图的星星塔 编程思路:1,计算要输入几行;2,计算每行的⭐数量,及空格的数量;计算相应的关系; 如图:假…

Redis 有序集合(sorted set) 命令

目录 1.Redis Zrevrank 命令 - 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序简介语法可用版本: > 2.2.0返回值: 如果成员是有序集 key 的成员,返回成员的排名。 如果成员不是有序集 key 的成员,返回 nil 。 示例 2…

视频号掀起内容新风向,这几类账号为何爆红?

12月初,视频号就迎来了好消息,官方发布消息称,视频号作者加入互选的门槛由10000粉调整为5000粉,其他条件不变。此举旨在激励更多创作者积极投入视频内容创作,从而获得更多商业合作的机会和收益。 为帮助大家更好地洞察…