Skip to content

Commit f6b589d

Browse files
da-liiiclaude
andcommitted
[0126] 添加任务文档 devel/0126.md
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 6b8d7f3 commit f6b589d

1 file changed

Lines changed: 53 additions & 0 deletions

File tree

devel/0126.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# [0126] 优化 smart_font 字体加载性能
2+
3+
## 1 相关文档
4+
- [dddd.md](dddd.md) - 任务文档模板
5+
6+
## 2 任务相关的代码文件
7+
- `src/Graphics/Fonts/smart_font.cpp`
8+
- `src/Graphics/Fonts/smart_font.hpp`
9+
- `tests/Graphics/Fonts/smart_font_test.cpp`
10+
11+
## 3 如何测试
12+
13+
### 3.1 确定性测试(单元测试)
14+
```bash
15+
xmake b smart_font_test
16+
xmake r smart_font_test
17+
```
18+
19+
### 3.2 非确定性测试(文档验证)
20+
```bash
21+
# 构建并运行字体相关测试,确保所有用例通过
22+
xmake b smart_font_test && xmake r smart_font_test
23+
```
24+
25+
## 4 如何提交
26+
27+
提交前执行以下最少步骤:
28+
29+
```bash
30+
xmake b smart_font_test
31+
xmake r smart_font_test
32+
```
33+
34+
## 5 What
35+
36+
通过缓存避免 smart_font 字体加载过程中的重复函数调用,优化性能。
37+
38+
1. 添加 `maybe_initialize_font` 辅助函数,避免对已初始化的子字体重复调用 `initialize_font`
39+
2. 在构造函数中缓存 `trimmed_tokenize(family, ",")` 结果(`family_tokens`),避免 `resolve(string c)``is_italic_prime` 中重复分割字符串
40+
3. 在构造函数中缓存 `logical_font` 结果(`given_font`),避免 `resolve(c, fam, attempt)` 中重复计算
41+
4. 缓存 `is_italic_prime` 的结果,避免对同一字体的斜体引号判断重复计算
42+
5. 新增 `test_performance``test_math_performance` 回归测试
43+
44+
## 6 Why
45+
46+
在字体加载过程中,通过添加日志发现很多函数会被重复调用。例如解析数学模式下 24 个希腊字母时,`initialize_font` 被调用了 21 次,虽然大部分调用的子字体已经初始化过。`trimmed_tokenize(family, ",")``logical_font` 也在每次 `resolve` 时被重复计算,造成不必要的性能开销。
47+
48+
## 7 How
49+
50+
- `maybe_initialize_font(int nr)`:在调用 `initialize_font` 前检查 `fn[nr]` 是否已初始化,只有未初始化时才执行实际的字体创建逻辑
51+
- `family_tokens`:在 `smart_font_rep` 构造函数中将 `trimmed_tokenize(family, ",")` 结果保存为成员变量,供 `resolve(string c)``is_italic_prime` 直接使用
52+
- `given_font`:在构造函数中将 `logical_font(family, variant, series, rshape)` 结果保存为成员变量,供 `resolve(c, fam, attempt)` 中的 `is_wanted` 调用直接使用
53+
- `is_italic_prime` 缓存:添加 `italic_prime_cached``italic_prime_result` 成员变量,首次计算后缓存结果

0 commit comments

Comments
 (0)