浏览器的渲染原理

进程与线程

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

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

浏览器的进程与线程模型

浏览器主线程:

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

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加速

相关推荐
zttbee38 分钟前
vue2的API大白话讲解
前端·vue.js·前端框架
几何心凉1 小时前
ToDesk/向日葵/UU远程,谁才是真正的“口袋里的办公室”
前端
亿元程序员1 小时前
一个人,4个岗位,20天:我用Cursor+Codex上线了一款微信小游戏
前端
LabVIEW开发1 小时前
将自定义 DLL 与 INI 文件部署到 LabVIEW 实时目标
前端·labview·labview知识·labview功能·labview程序
IT_陈寒1 小时前
Redis Pipeline用错竟比不用还慢,这个坑我帮你踩过了
前端·人工智能·后端
ynchyong2 小时前
JavaScript Promise 实战:.then() 与 .catch() 的区别及回调函数封装指南
开发语言·javascript·ecmascript·promise·then
大模型码小白2 小时前
数据可视化:AI处理多维数据的HTML5可视化方案
大数据·前端·javascript·人工智能·机器学习·信息可视化·html5
LabVIEW开发2 小时前
LabVIEW 前面板装饰图形的格式选择与自定义选板添加
前端·labview·labview知识·labview功能·labview程序
掘金者阿豪2 小时前
GPT-6 Astra 来了,GPT-5.6 Sol 还值得用吗?聊聊 Coding、百万上下文、价格和 Plus/Pro
前端·后端