|
| 1 | +# CFDesktop 性能优化和架构优化计划 |
| 2 | + |
| 3 | +## Context |
| 4 | + |
| 5 | +CFDesktop 是一个基于 Qt6 和 C++17 的桌面应用程序框架,实现了完整的 Material Design 3 UI 组件库。项目采用模块化架构设计,代码质量较高,但仍存在一些性能和架构层面的优化空间。 |
| 6 | + |
| 7 | +本计划旨在在 pre-release 阶段对项目进行系统的性能和架构优化,提升代码质量、运行效率和可维护性。 |
| 8 | + |
| 9 | +--- |
| 10 | + |
| 11 | +## 当前架构概览 |
| 12 | + |
| 13 | +``` |
| 14 | +CFDesktop/ |
| 15 | +├── base/ # 基础库模块 |
| 16 | +│ ├── include/ # 头文件(expected、WeakPtr、哈希等) |
| 17 | +│ └── system/ # 系统信息抽象层(CPU/Memory) |
| 18 | +├── ui/ # UI框架模块 |
| 19 | +│ ├── base/ # 基础工具(颜色、几何、缓动) |
| 20 | +│ ├── core/ # 核心引擎(主题、动效、令牌) |
| 21 | +│ ├── components/ # 通用组件(动画、状态机) |
| 22 | +│ └── widget/ # Material控件(按钮、文本框等) |
| 23 | +├── example/ # 示例程序 |
| 24 | +├── test/ # GoogleTest单元测试 |
| 25 | +└── scripts/ # 构建和工具脚本 |
| 26 | +``` |
| 27 | + |
| 28 | +**技术栈:** Qt6 + C++17 + CMake + GoogleTest |
| 29 | + |
| 30 | +--- |
| 31 | + |
| 32 | +## 优化计划 |
| 33 | + |
| 34 | +### 一、性能优化 |
| 35 | + |
| 36 | +#### 1.1 系统信息查询优化 |
| 37 | + |
| 38 | +**问题文件:** |
| 39 | +- `base/system/memory/private/linux_impl/cached_memory.cpp` |
| 40 | +- `base/system/cpu/private/linux_impl/cpu_profile.cpp` |
| 41 | +- `base/system/memory/private/win_impl/process_memory.cpp` |
| 42 | + |
| 43 | +**问题分析:** |
| 44 | +- Linux平台频繁读取 `/proc/meminfo`、`/proc/stat` 等系统文件 |
| 45 | +- CPU使用率计算需要阻塞100ms进行两次采样 |
| 46 | +- 缓存机制存在但缺乏过期策略 |
| 47 | + |
| 48 | +**优化方案:** |
| 49 | +1. 实现智能缓存策略(TTL过期 + LRU淘汰) |
| 50 | +2. 将CPU使用率计算移到后台线程 |
| 51 | +3. 使用 `QTimer` 替代 `std::this_thread::sleep_for` |
| 52 | +4. 添加查询频率限制机制 |
| 53 | + |
| 54 | +**预期收益:** 减少系统调用次数,降低CPU占用 |
| 55 | + |
| 56 | +--- |
| 57 | + |
| 58 | +#### 1.2 动画系统性能优化 |
| 59 | + |
| 60 | +**问题文件:** |
| 61 | +- `ui/widget/material/base/ripple_helper.cpp` |
| 62 | +- `ui/widget/material/base/state_machine.cpp` |
| 63 | +- `ui/components/animation_factory_manager.h` |
| 64 | + |
| 65 | +**问题分析:** |
| 66 | +- 波纹效果每次触发都遍历所有波纹实例 |
| 67 | +- 状态变更频繁触发UI重绘 |
| 68 | +- 动画工厂缓存可能导致内存占用增加 |
| 69 | + |
| 70 | +**优化方案:** |
| 71 | +1. 实现脏矩形机制,只重绘变化区域 |
| 72 | +2. 批量更新波纹状态,减少重绘次数 |
| 73 | +3. 使用 `QTimer::singleShot` 合并高频更新 |
| 74 | +4. 添加动画实例缓存上限 |
| 75 | + |
| 76 | +**预期收益:** 减少UI重绘开销,提升动画流畅度 |
| 77 | + |
| 78 | +--- |
| 79 | + |
| 80 | +#### 1.3 内存管理优化 |
| 81 | + |
| 82 | +**问题文件:** |
| 83 | +- `ui/widget/material/base/state_machine.cpp` |
| 84 | +- `base/include/base/weak_ptr/weak_ptr.h` |
| 85 | + |
| 86 | +**问题分析:** |
| 87 | +- 动画信号槽连接可能在对象销毁时未正确断开 |
| 88 | +- 定时器可能未在对象销毁时清除 |
| 89 | +- WeakPtr 生命周期管理需要加强 |
| 90 | + |
| 91 | +**优化方案:** |
| 92 | +1. 在析构函数中确保所有动画正确清理 |
| 93 | +2. 使用 RAII 模式管理定时器和信号连接 |
| 94 | +3. 添加内存使用统计和分析工具 |
| 95 | +4. 考虑实现对象池减少频繁创建销毁 |
| 96 | + |
| 97 | +**预期收益:** 减少内存泄漏风险,稳定内存占用 |
| 98 | + |
| 99 | +--- |
| 100 | + |
| 101 | +### 二、架构优化 |
| 102 | + |
| 103 | +#### 2.1 模块依赖优化 |
| 104 | + |
| 105 | +**当前状态:** 依赖关系清晰 (`example → ui → base`) |
| 106 | + |
| 107 | +**优化方案:** |
| 108 | +1. 进一步减少头文件依赖,使用前向声明 |
| 109 | +2. 将 Pimpl 惯用法应用到更多组件 |
| 110 | +3. 评估 `ui/widget` 和 `ui/components` 的边界是否清晰 |
| 111 | + |
| 112 | +**预期收益:** 减少编译时间,提高模块独立性 |
| 113 | + |
| 114 | +--- |
| 115 | + |
| 116 | +#### 2.2 错误处理标准化 |
| 117 | + |
| 118 | +**当前状态:** 使用 `cf::expected<T, E>` 进行错误处理 |
| 119 | + |
| 120 | +**优化方案:** |
| 121 | +1. 建立统一的错误码体系 |
| 122 | +2. 为 `expected` 添加更多实用方法 |
| 123 | +3. 考虑添加错误上下文追踪功能 |
| 124 | + |
| 125 | +**预期收益:** 提高错误处理一致性和调试效率 |
| 126 | + |
| 127 | +--- |
| 128 | + |
| 129 | +#### 2.3 Scripts 脚本重构 |
| 130 | + |
| 131 | +**问题目录:** `scripts/` |
| 132 | + |
| 133 | +**问题分析:** |
| 134 | +- scripts 目录下存在大量重复代码 |
| 135 | +- 缺乏统一的脚本框架和工具函数库 |
| 136 | +- 各脚本之间复用性差 |
| 137 | + |
| 138 | +**优化方案:** |
| 139 | +1. 提取公共脚本函数库(`scripts/lib/`) |
| 140 | +2. 统一脚本参数解析方式 |
| 141 | +3. 规范化脚本输出格式和日志 |
| 142 | +4. 添加脚本单元测试 |
| 143 | + |
| 144 | +**预期收益:** 减少代码重复,提高脚本可维护性 |
| 145 | + |
| 146 | +--- |
| 147 | + |
| 148 | +#### 2.4 测试覆盖率提升 |
| 149 | + |
| 150 | +**当前状态:** 有 GoogleTest 框架,但测试覆盖不足 |
| 151 | + |
| 152 | +**优化方案:** |
| 153 | +1. 添加代码覆盖率统计工具(如 gcov/lcov) |
| 154 | +2. 为核心组件补充边界条件测试 |
| 155 | +3. 添加性能基准测试 |
| 156 | +4. 集成静态分析工具(clang-tidy) |
| 157 | +5. 补充 widgets 和 components 的交互测试 |
| 158 | +6. 添加跨平台兼容性测试用例 |
| 159 | + |
| 160 | +**预期收益:** 提高代码质量和可靠性,确保跨平台兼容 |
| 161 | + |
| 162 | +--- |
| 163 | + |
| 164 | +### 三、构建和发布优化 |
| 165 | + |
| 166 | +#### 3.1 构建配置优化 |
| 167 | + |
| 168 | +**问题分析:** Debug 构建使用 `-O0`,开发体验较差 |
| 169 | + |
| 170 | +**优化方案:** |
| 171 | +1. 添加 `DebugOptimized` 构建类型(`-Og` 优化级别) |
| 172 | +2. 优化链接器参数 |
| 173 | + |
| 174 | +--- |
| 175 | + |
| 176 | +#### 3.2 CI/CD 增强 |
| 177 | + |
| 178 | +**优化方案:** |
| 179 | +1. 添加性能回归检测 |
| 180 | +2. 集成静态分析和代码质量检查 |
| 181 | +3. 自动化发布流程 |
| 182 | + |
| 183 | +--- |
| 184 | + |
| 185 | +## 优先级排序 |
| 186 | + |
| 187 | +| 优先级 | 优化项 | 预期工作量 | 影响范围 | |
| 188 | +|--------|--------|-----------|----------| |
| 189 | +| P0 | 系统信息查询缓存优化 | 中 | 全局性能 | |
| 190 | +| P0 | 动画系统脏矩形机制 | 高 | UI性能 | |
| 191 | +| P0 | 测试覆盖率提升 | 高 | 可靠性 | |
| 192 | +| P1 | 内存泄漏风险修复 | 中 | 稳定性 | |
| 193 | +| P1 | Scripts 脚本重构 | 中 | 可维护性 | |
| 194 | +| P2 | 错误处理标准化 | 低 | 代码质量 | |
| 195 | +| P3 | 构建配置优化 | 低 | 开发体验 | |
| 196 | + |
| 197 | +--- |
| 198 | + |
| 199 | +## 关键文件清单 |
| 200 | + |
| 201 | +### 需要修改的文件 |
| 202 | + |
| 203 | +**性能优化:** |
| 204 | +- `base/system/memory/private/linux_impl/cached_memory.cpp` - 缓存策略 |
| 205 | +- `base/system/cpu/private/linux_impl/cpu_profile.cpp` - CPU查询异步化 |
| 206 | +- `ui/widget/material/base/ripple_helper.cpp` - 波纹批量更新 |
| 207 | +- `ui/widget/material/base/state_machine.cpp` - 状态更新合并 |
| 208 | + |
| 209 | +**架构优化:** |
| 210 | +- `base/include/base/expected/expected.hpp` - 错误处理增强 |
| 211 | +- `ui/core/theme_manager.cpp` - 单例模式优化 |
| 212 | +- 各组件头文件 - 前向声明优化 |
| 213 | + |
| 214 | +**Scripts 重构:** |
| 215 | +- `scripts/` 下所有脚本文件 - 提取公共函数库 |
| 216 | + |
| 217 | +### 需要新增的文件 |
| 218 | + |
| 219 | +- `base/include/base/cache/lru_cache.h` - LRU缓存实现 |
| 220 | +- `ui/base/paint_optimizer.h` - 绘制优化器 |
| 221 | +- `test/performance/` - 性能基准测试目录 |
| 222 | + |
| 223 | +--- |
| 224 | + |
| 225 | +## 验证计划 |
| 226 | + |
| 227 | +1. **编译验证:** 确保所有构建类型编译通过 |
| 228 | +2. **单元测试:** 运行完整测试套件,确保无回归 |
| 229 | +3. **性能测试:** 运行基准测试,对比优化前后数据 |
| 230 | +4. **内存检测:** 使用 Valgrind/ASan 检测内存问题 |
| 231 | +5. **UI测试:** 手动验证动画流畅度和响应速度 |
| 232 | + |
| 233 | +--- |
| 234 | + |
| 235 | +## 实施建议 |
| 236 | + |
| 237 | +1. 分阶段实施,优先完成 P0 级别优化 |
| 238 | +2. 每项优化后进行测试验证 |
| 239 | +3. 保持向后兼容性,避免破坏现有API |
| 240 | +4. 及时更新相关文档和示例 |
0 commit comments