浏览器的渲染原理

进程与线程

进程:一块内存空间,存储程序运行的所有资源,进程间通信需要双方都同意才可通信

线程:进程中的执行单位,所有代码都必须在线程里执行(一个进程至少有一个主线程),每个线程共享进程中的资源

浏览器的进程与线程模型

浏览器主线程:

负责界面展示,用户交互,子进程管理等功能

gpu进程:

处理页面的图片渲染,提高网页的绘制速度

网络进程:

处理网络请求,加载网页,图片,视频,下载文件等

渲染进程:

渲染进程启动后,会开启一个渲染主线程,负责处理html,css和js代码

渲染流程:

1.解析html

将得到的html字符串,转换为两棵树(dom树和css树)

css表类型:内部样式表,内联式样式表,外部样式表,浏览器默认样式表

预解析线程:并行获取和解析外部css文件,以减少阻塞,提高html执行效率(此外还会预解析js文件)css解析不会直接阻塞html解析,单js解析会直接阻塞html解析

2.样式计算

将cssom树中的样式规则,应用到dom节点上,形成一颗带有样式的dom树(涉及css属性值计算过程)

3.布局

确定每个节点的几何信息(如相对单位),最终生成一颗布局树(dom树和布局树会不一样,因为有些节点的几何信息是隐藏的)

4.分层

每个节点都从属于某个图层,当页面变化时,不需要重新绘制整个页面,只需绘制对应改变节点所在的图层即可(有些操作会触发单独分层,比如

transform:translateZ(0)触发gpu加速

滚动容器元素

层叠上下文相关的属性【z-index、opacity、filter、position】

文字或图片超出容器边界

相邻元素发生重叠裁剪

正在执行transform:opacity等动画的节点

使用will-change预先声明变化的元素)

5.绘制指令

为每个图层生成绘制指令列表,将指令提交给合成线程

6.分块

合成线程将图层分成更小的块(多线程一起分块,即从线程池调用线程共同进行分块操作,完成后再归还线程池)

7.光栅化

位图:像素点组成的图片,记录了每个像素点颜色,透明度等信息

把绘制指令转化为位图(优先转化可见区域的瓦片)

分块完成后,所有瓦片会提交到gpu进程,由gpu进程生成位图,这个过程会使用gpu加速

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄2 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端