mindmap
root((B树))
理论基础
定义与特性
多路平衡树
磁盘友好
高度可控
历史发展
1970年提出
Bayer和McCreight
数据库应用
核心性质
节点结构
多个关键字
多个子节点
有序排列
平衡条件
节点关键字数
子树数量
叶子同层
基本操作
查找操作
节点内查找
子树选择
Olog n
插入操作
节点分裂
向上传播
复杂度分析
删除操作
节点合并
关键字借用
复杂情况
B+树变种
结构特点
数据在叶子
叶子链表
更高扇出
优势
范围查询
顺序扫描
索引优化
工业实践
数据库索引
MySQL InnoDB
PostgreSQL
Oracle
文件系统
NTFS
ext4
HFS+
目录
一、前言
1. 研究背景
B树(B-Tree)是一种多路平衡搜索树,由Rudolf Bayer和Edward M. McCreight在1970年发明。B树专门为磁盘存储设计,通过增加每个节点的分支数(扇出),减少了树的高度,从而减少了磁盘I/O次数。
根据Google的研究,B树及其变体B+树是现代数据库系统的核心数据结构。MySQL的InnoDB、PostgreSQL、Oracle等主流数据库都使用B+树作为索引结构,处理数十亿条记录。
2. 历史发展
- 1970年:Bayer和McCreight提出B树
- 1970s:在数据库系统中应用
- 1980s:B+树变种广泛使用
- 1990s至今:成为数据库索引的标准
二、概述
1. 什么是B树
B树(B-Tree)是一种多路平衡搜索树,每个节点可以有多个子节点(通常几十到几百个)。这种设计使得B树在存储大量数据时仍能保持较低的高度,非常适合磁盘存储。
三、B树的形式化定义
1. B树的定义(原始论文定义)
定义(Bayer & McCreight, 1970):
B树是一种多路平衡搜索树,满足以下性质:
对于m阶B树(m ≥ 3):
- 节点关键字数:每个节点最多有m-1个关键字,最少有⌈m/2⌉-1个关键字(根节点除外)
- 子节点数:每个节点最多有m个子节点,最少有⌈m/2⌉个子节点(根节点和叶子节点除外)
- 关键字有序:节点中的关键字按升序排列
- 子树性质:对于关键字k_i,左子树所有关键字 < k_i,右子树所有关键字 > k_i
- 叶子同层:所有叶子节点在同一层
形式化表述:
设B树T的阶数为m,对于树中的任意节点v:
- 如果v不是根节点,则:⌈m/2⌉ - 1 ≤ |keys(v)| ≤ m - 1
- 如果v不是叶子节点,则:⌈m/2⌉ ≤ |children(v)| ≤ m
- 所有叶子节点在同一层(深度相同)
学术参考:
- Bayer, R., & McCreight, E. M. (1970). "Organization and maintenance of large ordered indices." Acta Informatica, 1(3), 173-189.
- CLRS Chapter 18: B-Trees
2. B树的特点
- 多路搜索:每个节点可以有多个子节点(通常几十到几百个)
- 平衡性:保持树的高度平衡,所有叶子节点在同一层
- 磁盘友好:节点大小对应磁盘页大小,减少I/O次数
- 高度可控:对于n个关键字,树的高度为O(log_m n),m为阶数
1. B树的结构
3阶B树示例:
[50]
/ \
[20,30] [70,80]
/ | \ / | \
[10][25][40][60][75][90]
四、B树的性质与数学证明
1. B树的核心性质
对于m阶B树(m ≥ 3):
-
节点关键字数约束:
- 每个节点最多有m-1个关键字
- 除了根节点,每个节点至少有⌈m/2⌉-1个关键字
- 根节点至少有1个关键字(如果非空)
-
子节点数约束:
- 每个节点最多有m个子节点
- 除了根节点和叶子节点,每个节点至少有⌈m/2⌉个子节点
-
结构性质:
- 所有叶子节点在同一层(深度相同)
- 节点中的关键字按升序排列
-
搜索性质:
- 对于关键字k_i,左子树所有关键字 < k_i
- 对于关键字k_i,右子树所有关键字 > k_i
2. B树高度的数学分析
定理:对于包含n个关键字的m阶B树,高度h满足:
证明:
设B树的高度为h,根节点深度为1。
最小节点数分析:
- 第1层(根):1个节点,至少1个关键字
- 第2层:至少⌈m/2⌉个节点,每个至少⌈m/2⌉-1个关键字
- 第3层:至少⌈m/2⌉²个节点
- ...
- 第h层(叶子):至少⌈m/2⌉^(h-1)个节点
总关键字数下界:
简化得:
因此:
实际应用(m=200,n=10⁹):
- 树高度:h ≤ log₁₀₀(5×10⁸) + 1 ≈ 4.7 + 1 ≈ 6层
- 磁盘I/O:最多6次(包括根节点)
学术参考:
- CLRS Chapter 18.1: Definition of B-trees
- Comer, D. (1979). "The Ubiquitous B-Tree." ACM Computing Surveys, 11(2), 121-137.
3阶B树示例
[50]
/ \
[20,30] [70,80]
/ | \ / | \
[10][25][40][60][75][90]
每个节点最多3个子节点
非根节点至少有1个关键字
五、B树的操作
1. 查找
def search_b_tree(node, key):
i = 0
# 找到第一个大于等于key的关键字位置
while i < len(node.keys) and key > node.keys[i]:
i += 1
# 如果找到关键字
if i < len(node.keys) and node.keys[i] == key:
return node, i
# 如果是叶子节点,未找到
if node.is_leaf:
return None, -1
# 递归搜索子节点
return search_b_tree(node.children[i], key)
2. 插入
插入操作可能涉及节点分裂:
- 找到插入位置
- 如果是叶子节点且未满,直接插入
- 如果节点已满,分裂节点
- 向上传播分裂
3. 删除
删除操作可能涉及节点合并:
- 找到要删除的关键字
- 如果是叶子节点,直接删除
- 如果是内部节点,用前驱或后继替换
- 如果节点关键字过少,进行合并
六、B+树
B+树是B树的变种,常用于数据库索引。
1. B+树的特点
- 所有数据在叶子节点:内部节点只存储索引
- 叶子节点形成链表:便于范围查询
- 更高的扇出:内部节点可以存储更多关键字
2. B+树结构
内部节点(索引):
[50]
/ \
[20,30] [70,80]
叶子节点(数据):
[10][20][25][30][40][50][60][70][75][80][90]
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
叶子节点链表
七、应用场景
1. 数据库索引
- MySQL的InnoDB存储引擎使用B+树
- PostgreSQL也使用B+树变种
2. 文件系统
- NTFS文件系统使用B树变种
- 许多现代文件系统都采用类似结构
3. 优势
- 磁盘友好:减少磁盘I/O次数
- 范围查询:B+树特别适合范围查询
- 高度可控:即使数据量很大,树的高度也较小
八、B树 vs B+树
| 特性 | B树 | B+树 |
|---|---|---|
| 数据位置 | 所有节点 | 仅叶子节点 |
| 叶子节点 | 无连接 | 形成链表 |
| 查找效率 | 可能在任何节点找到 | 必须到叶子节点 |
| 范围查询 | 较慢 | 较快 |
| 内部节点 | 存储数据 | 仅存储索引 |
九、时间复杂度分析(详细推导)
1. 查找操作
时间复杂度:O(log_m n),其中m为B树的阶数
证明:
查找操作从根节点开始,逐层向下查找:
- 每层节点内查找:O(log m)(二分查找)
- 树的高度:h = O(log_m n)
- 总时间复杂度:O(h × log m) = O(log_m n × log m) = O(log n)
实际性能(m=200,n=10⁹):
- 树高度:约6层
- 每层查找:log₂(200) ≈ 8次比较
- 总比较次数:6 × 8 = 48次
- 磁盘I/O:6次(每层1次)
学术参考:
- CLRS Chapter 18.2: Basic operations on B-trees
2. 插入操作
时间复杂度:O(log_m n)
详细分析:
- 查找插入位置:O(log_m n)
- 插入关键字:O(1)(如果节点未满)
- 节点分裂:O(m)(最坏情况,但通常节点未满)
- 向上传播分裂:O(log_m n)(最坏情况分裂到根节点)
总时间复杂度:O(log_m n)
学术参考:
- CLRS Chapter 18.2: Basic operations on B-trees
3. 删除操作
时间复杂度:O(log_m n)
详细分析:
- 查找删除位置:O(log_m n)
- 删除关键字:O(1)(如果是叶子节点且节点关键字数足够)
- 节点合并:O(m)(最坏情况)
- 向上传播合并:O(log_m n)(最坏情况合并到根节点)
总时间复杂度:O(log_m n)
学术参考:
- CLRS Chapter 18.3: Deleting a key from a B-tree
4. 复杂度对比表
| 操作 | B树(m=200) | 红黑树 | 说明 |
|---|---|---|---|
| 查找 | O(log₂₀₀ n) | O(log₂ n) | B树略慢但I/O更少 |
| 插入 | O(log₂₀₀ n) | O(log₂ n) | B树略慢但I/O更少 |
| 删除 | O(log₂₀₀ n) | O(log₂ n) | B树略慢但I/O更少 |
| 磁盘I/O | O(log₂₀₀ n) | O(n) | B树优势明显 |
| 范围查询 | O(log₂₀₀ n + k) | O(log₂ n + k) | 性能接近 |
十、工业界实践案例
1. 案例1:MySQL InnoDB的B+树索引(Oracle/MySQL实践)
背景:MySQL的InnoDB存储引擎使用B+树作为主键索引和辅助索引。
技术实现分析(基于MySQL InnoDB源码):
-
B+树结构设计:
- 内部节点:只存储关键字和子节点指针,不存储数据
- 叶子节点:存储关键字和数据,形成有序链表
- 页结构:每个节点对应一个16KB的页,对应磁盘页大小
- 扇出:每个内部节点可以存储约100-200个关键字
-
聚簇索引(Clustered Index):
- 主键索引:叶子节点存储完整行数据
- 优势:主键查找只需一次I/O(如果数据在内存中)
- 劣势:插入和更新可能导致页分裂
-
辅助索引(Secondary Index):
- 结构:叶子节点存储主键值,而非完整行数据
- 回表:通过主键值回表查询完整数据
- 覆盖索引:如果查询字段都在索引中,无需回表
性能数据(MySQL官方测试,10亿条记录):
| 操作 | B+树索引 | 哈希索引 | 说明 |
|---|---|---|---|
| 点查询 | 3-4次I/O | 1次I/O | 哈希索引更快 |
| 范围查询 | 3-4次I/O + 顺序扫描 | 不支持 | B+树优势明显 |
| 插入操作 | 3-4次I/O | 1次I/O | 哈希索引更快 |
| 索引大小 | 基准 | +20% | B+树略大 |
学术参考:
- MySQL官方文档:InnoDB Storage Engine
- Comer, D. (1979). "The Ubiquitous B-Tree." ACM Computing Surveys
- Graefe, G. (2011). "Modern B-Tree Techniques." Foundations and Trends in Databases
伪代码:InnoDB B+树查找
ALGORITHM InnoDBSearch(root, key)
// 从根节点开始查找
node ← root
WHILE NOT node.isLeaf DO
// 在内部节点中二分查找
index ← BinarySearch(node.keys, key)
// 获取子节点页号
childPageId ← node.children[index]
// 从磁盘读取子节点
node ← ReadPageFromDisk(childPageId)
// 在叶子节点中查找
index ← BinarySearch(node.keys, key)
IF node.keys[index] = key THEN
// 返回行数据(聚簇索引)或主键(辅助索引)
RETURN node.values[index]
ELSE
RETURN NULL
2. 案例2:PostgreSQL的B树索引(PostgreSQL实践)
背景:PostgreSQL使用B树变种作为默认索引类型。
技术实现分析(基于PostgreSQL源码):
-
B树变种设计:
- 结构:类似B+树,但内部节点也存储数据指针
- 优势:某些查询可能不需要到达叶子节点
- 劣势:内部节点较大,扇出略小
-
功能特性:
- 唯一索引:支持唯一性约束
- 范围查询:支持高效的范围查询
- 多列索引:支持复合索引(多列组合)
-
性能优化:
- 索引压缩:压缩重复的前缀,节省空间
- 部分索引:只索引满足条件的行
- 表达式索引:支持函数表达式索引
性能数据(PostgreSQL官方测试,1亿条记录):
| 操作 | B树索引 | 哈希索引 | 说明 |
|---|---|---|---|
| 点查询 | O(log n) | O(1) | 哈希索引更快 |
| 范围查询 | O(log n + k) | 不支持 | B树优势明显 |
| 多列查询 | O(log n) | 不支持 | B树优势明显 |
学术参考:
- PostgreSQL官方文档:B-Tree Indexes
- PostgreSQL Source Code: src/backend/access/nbtree/
- Stonebraker, M., et al. (2010). "The Design of Postgres." ACM SIGMOD Record
3. 案例3:文件系统的B树应用(Microsoft/Linux Foundation实践)
背景:NTFS、ext4等文件系统使用B树变种管理文件目录。
技术实现分析(基于NTFS和ext4源码):
-
NTFS文件系统(Microsoft Windows):
- B+树目录索引:使用B+树管理大目录(>1000个文件)
- MFT(Master File Table):使用B+树索引文件元数据
- 性能优势:大目录查找从O(n)降至O(log n)
-
ext4文件系统(Linux):
- HTree索引:使用B树变种管理大目录
- 目录项组织:使用哈希+B树混合索引
- 性能优势:支持百万级文件的目录
性能数据(100万个文件的目录):
| 文件系统 | 查找时间 | 说明 |
|---|---|---|
| ext2(线性) | O(n) ≈ 1000ms | 基准 |
| ext4(B树) | O(log n) ≈ 10ms | 100倍提升 |
| NTFS(B+树) | O(log n) ≈ 8ms | 125倍提升 |
学术参考:
- Microsoft Windows Internals Documentation: NTFS File System
- Linux Kernel Documentation: ext4 File System
- Love, R. (2010). Linux Kernel Development (3rd ed.). Chapter 13: The Virtual Filesystem
十一、总结
B树是多路平衡搜索树,通过增加节点分支数减少了树的高度,非常适合磁盘存储。B+树作为B树的变种,在数据库索引中占据主导地位,是现代数据库系统的核心数据结构。
关键要点
- 多路平衡:每个节点可以有多个子节点,减少树高
- 磁盘友好:节点大小对应磁盘页,减少I/O次数
- B+树优势:数据在叶子节点,支持高效的范围查询
- 广泛应用:数据库索引、文件系统都使用B树
延伸阅读
核心论文:
-
Bayer, R., & McCreight, E. M. (1970). "Organization and maintenance of large ordered indices." Acta Informatica, 1(3), 173-189.
- B树的原始论文,首次提出多路平衡搜索树
-
Comer, D. (1979). "The Ubiquitous B-Tree." ACM Computing Surveys, 11(2), 121-137.
- B树的经典综述论文
-
Graefe, G. (2011). "Modern B-Tree Techniques." Foundations and Trends in Databases, 3(4), 203-402.
- 现代B树技术的全面综述
核心教材:
-
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms (3rd ed.). MIT Press.
- Chapter 18: B-Trees - B树的详细理论
-
Ramakrishnan, R., & Gehrke, J. (2003). Database Management Systems (3rd ed.). McGraw-Hill.
- Chapter 8: Storage and Indexing - B树在数据库中的应用
工业界技术文档:
-
MySQL官方文档:InnoDB Storage Engine
-
PostgreSQL官方文档:B-Tree Indexes
-
MySQL Source Code: InnoDB B+ Tree Implementation
-
PostgreSQL Source Code: B-Tree Index Implementation
技术博客与研究:
-
Google Research. (2020). "B-Tree Optimization in Large-Scale Database Systems."
-
Amazon Science Blog. (2019). "DynamoDB: Design and Implementation of a NoSQL Database Service."
3. 为什么使用B树?
- 磁盘I/O优化:减少访问磁盘的次数,提升性能
- 适合大数据:即使有数百万数据,查找也很高效
- 适合顺序访问:B+树的叶子链表便于顺序扫描
- 高度可控:即使数据量很大,树的高度也较小(通常3-4层)
梦想从学习开始,事业从实践起步:理论是基础,实践是关键,持续学习是成功之道。
数据结构与算法是计算机科学的基础,是软件工程师的核心技能。
本系列文章旨在复习数据结构与算法核心知识,为人工智能时代,接触AIGC、AI Agent,与AI平台、各种智能半智能业务场景的开发需求做铺垫:
- 01-📝数据结构与算法核心知识 | 知识体系导论
- 02-⚙️数据结构与算法核心知识 | 开发环境配置
- 03-📊数据结构与算法核心知识 | 复杂度分析: 算法性能评估的理论与实践
- 04-📦数据结构与算法核心知识 | 动态数组:理论与实践的系统性研究
- 05-🔗数据结构与算法核心知识| 链表 :动态内存分配的数据结构理论与实践
- 06-📚数据结构与算法核心知识 | 栈:后进先出数据结构理论与实践
- 07-🚶数据结构与算法核心知识 | 队列:先进先出数据结构理论与实践
- 08-🌳数据结构与算法核心知识 | 二叉树:树形数据结构的基础理论与应用
- 09-🔍数据结构与算法核心知识 | 二叉搜索树:有序数据结构理论与实践
- 10-⚖️ 数据结构与算法核心知识 | 平衡二叉搜索树:自平衡机制的理论与实践
- 11-🌲数据结构与算法核心知识 | AVL树: 严格平衡的二叉搜索树
- 12-🌴数据结构与算法核心知识 | B树: 多路平衡搜索树的理论与实践
- 13-🔴数据结构与算法核心知识 | 红黑树:自平衡二叉搜索树的理论与实践
- 14-📋数据结构与算法核心知识 | 集合:数学集合理论在计算机科学中的应用
- 15-🗺️数据结构与算法核心知识 | 映射:键值对存储的数据结构理论与实践
- 16-🔑数据结构与算法核心知识 | 哈希表:快速查找的数据结构理论与实践
- 17-⛰️数据结构与算法核心知识 | 二叉堆:优先级队列的基础数据结构
- 18-🎯 数据结构与算法核心知识 | 优先级队列:基于堆的高效调度数据结构
- 19-📦数据结构与算法核心知识 | 哈夫曼树: 数据压缩的基础算法
- 20-🔤数据结构与算法核心知识 | Trie:字符串检索的高效数据结构
- 21-🕸️数据结构与算法核心知识 | 图结构:网络与关系的数据结构理论与实践
- 22-🔄数据结构与算法核心知识 | 排序算法: 数据组织的核心算法理论与实践
- 23-🔎数据结构与算法核心知识 | 查找算法: 数据检索的核心算法理论与实践
- 24-💡数据结构与算法核心知识 | 动态规划: 最优子结构问题的求解方法
- 25-🎲数据结构与算法核心知识 | 贪心算法: 局部最优的全局策略
- 26-🔙数据结构与算法核心知识 | 回溯算法: 穷举搜索的剪枝优化
- 27-✂️数据结构与算法核心知识 | 分治算法: 分而治之的算法设计思想
- 28-📝数据结构与算法核心知识 | 字符串算法: 文本处理的核心算法理论与实践
- 29-🔗数据结构与算法核心知识 | 并查集: 连通性问题的高效数据结构
- 30-📏数据结构与算法核心知识 | 线段树: 区间查询的高效数据结构
其它专题系列文章
1. 前知识
- 01-探究iOS底层原理|综述
- 02-探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM】
- 03-探究iOS底层原理|LLDB
- 04-探究iOS底层原理|ARM64汇编
2. 基于OC语言探索iOS底层原理
- 05-探究iOS底层原理|OC的本质
- 06-探究iOS底层原理|OC对象的本质
- 07-探究iOS底层原理|几种OC对象【实例对象、类对象、元类】、对象的isa指针、superclass、对象的方法调用、Class的底层本质
- 08-探究iOS底层原理|Category底层结构、App启动时Class与Category装载过程、load 和 initialize 执行、关联对象
- 09-探究iOS底层原理|KVO
- 10-探究iOS底层原理|KVC
- 11-探究iOS底层原理|探索Block的本质|【Block的数据类型(本质)与内存布局、变量捕获、Block的种类、内存管理、Block的修饰符、循环引用】
- 12-探究iOS底层原理|Runtime1【isa详解、class的结构、方法缓存cache_t】
- 13-探究iOS底层原理|Runtime2【消息处理(发送、转发)&&动态方法解析、super的本质】
- 14-探究iOS底层原理|Runtime3【Runtime的相关应用】
- 15-探究iOS底层原理|RunLoop【两种RunloopMode、RunLoopMode中的Source0、Source1、Timer、Observer】
- 16-探究iOS底层原理|RunLoop的应用
- 17-探究iOS底层原理|多线程技术的底层原理【GCD源码分析1:主队列、串行队列&&并行队列、全局并发队列】
- 18-探究iOS底层原理|多线程技术【GCD源码分析1:dispatch_get_global_queue与dispatch_(a)sync、单例、线程死锁】
- 19-探究iOS底层原理|多线程技术【GCD源码分析2:栅栏函数dispatch_barrier_(a)sync、信号量dispatch_semaphore】
- 20-探究iOS底层原理|多线程技术【GCD源码分析3:线程调度组dispatch_group、事件源dispatch Source】
- 21-探究iOS底层原理|多线程技术【线程锁:自旋锁、互斥锁、递归锁】
- 22-探究iOS底层原理|多线程技术【原子锁atomic、gcd Timer、NSTimer、CADisplayLink】
- 23-探究iOS底层原理|内存管理【Mach-O文件、Tagged Pointer、对象的内存管理、copy、引用计数、weak指针、autorelease
3. 基于Swift语言探索iOS底层原理
关于函数、枚举、可选项、结构体、类、闭包、属性、方法、swift多态原理、String、Array、Dictionary、引用计数、MetaData等Swift基本语法和相关的底层原理文章有如下几篇:
- 01-📝Swift5常用核心语法|了解Swift【Swift简介、Swift的版本、Swift编译原理】
- 02-📝Swift5常用核心语法|基础语法【Playground、常量与变量、常见数据类型、字面量、元组、流程控制、函数、枚举、可选项、guard语句、区间】
- 03-📝Swift5常用核心语法|面向对象【闭包、结构体、类、枚举】
- 04-📝Swift5常用核心语法|面向对象【属性、inout、类型属性、单例模式、方法、下标、继承、初始化】
- 05-📝Swift5常用核心语法|高级语法【可选链、协议、错误处理、泛型、String与Array、高级运算符、扩展、访问控制、内存管理、字面量、模式匹配】
- 06-📝Swift5常用核心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、响应式编程、Swift源码分析】
4. C++核心语法
- 01-📝C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
- 02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
- 03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
- 04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
- 05-📝C++核心语法|面向对象3【 继承和派生、多态、静态成员、const成员、引用类型成员、VS的内存窗口】
5. Vue全家桶
- 01-📝Vue全家桶核心知识|Vue基础【Vue概述、Vue基本使用、Vue模板语法、基础案例、Vue常用特性、综合案例】
- 02-📝Vue全家桶核心知识|Vue常用特性【表单操作、自定义指令、计算属性、侦听器、过滤器、生命周期、综合案例】
- 03-📝Vue全家桶核心知识|组件化开发【组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互、组件插槽、基于组件的
- 04-📝Vue全家桶核心知识|多线程与网络【前后端交互模式、promise用法、fetch、axios、综合案例】
- 05-📝Vue全家桶核心知识|Vue Router【基本使用、嵌套路由、动态路由匹配、命名路由、编程式导航、基于vue-router的案例】
- 06-📝Vue全家桶核心知识|前端工程化【模块化相关规范、webpack、Vue 单文件组件、Vue 脚手架、Element-UI 的基本使用】
- 07-📝Vue全家桶核心知识|Vuex【Vuex的基本使用、Vuex中的核心特性、vuex案例】
其它底层原理专题
1. 底层原理相关专题
2. iOS相关专题
- 01-iOS底层原理|iOS的各个渲染框架以及iOS图层渲染原理
- 02-iOS底层原理|iOS动画渲染原理
- 03-iOS底层原理|iOS OffScreen Rendering 离屏渲染原理
- 04-iOS底层原理|因CPU、GPU资源消耗导致卡顿的原因和解决方案