Documents/Code_Review_Report.md:逐项说明本轮改了什么、为什么、效果如何, 含体积节表前后对照(890,880 -> 794,112 B,-96,768 / -10.9%)、 Debug 构建缺陷(DEBUG_OPT 从未生效)、面板派发收敛与编译期保护、 ApplicationCommands 拆分、性能审查结论(含 3 个记录未做的优化点)、 注释/文档校正、验证清单、提交清单与后续建议。 同时把 Code_Review_Progress.md 补齐 P15/P16 与“搁置节点”的原因说明。
151 lines
7.7 KiB
Markdown
151 lines
7.7 KiB
Markdown
# Code Review 进度(分支 `Code_Review`)
|
||
|
||
> 每个节点完成后追加:节点号、改动摘要、验证方式、实测数字。
|
||
> 计划见 `Documents/Code_Review_Plan.md`;最终报告见 `Documents/Code_Review_Report.md`。
|
||
|
||
## 基线(起点 `764e5be`)
|
||
|
||
| 项 | 数值 |
|
||
| --- | --- |
|
||
| Release 产物 | **890,880 B** |
|
||
| `.text` | 753,136 B |
|
||
| `.rdata` | 36,936 B |
|
||
| `.pdata` | 30,420 B |
|
||
| `.xdata` | 29,496 B |
|
||
| `.rsrc` | 20,656 B |
|
||
| `.idata` | 12,856 B |
|
||
| Debug 产物 | 1,801,617 B |
|
||
| 源码规模 | 约 5.6 万行 |
|
||
|
||
关键发现(详见计划 §一):
|
||
|
||
* `dynamic_cast`(`Toolbar.cpp:370`)使最小复现程序从 39,936 B 涨到 115,200 B
|
||
⇒ **+75,264 B**;map 中 `cp-demangle.o` 占 **56,320 B**。
|
||
* 每个 `EdgePanelKind` 在源码中出现 21–26 次(6 种面板 ⇒ 约 140 处手写分支)。
|
||
|
||
---
|
||
|
||
## 节点记录
|
||
|
||
(下面按完成顺序追加)
|
||
|
||
### P1 移除 `dynamic_cast` + 关闭 RTTI —— ✅ 完成(提交 `5de3763`)
|
||
|
||
**改动**
|
||
|
||
1. `Toolbar::BuildBoxes` 里唯一的 `dynamic_cast` 是**多余强转**(`Button::widget` 本来就是
|
||
`UiButtonWidget*`)。改为直接遍历 `m_buttons`(与 `m_root->Children()` 同源同序)。
|
||
2. 仅关 RTTI **不够**:`cp-demangle.o` 仍在链接里。真凶是 libstdc++ 的 `vterminate.o`
|
||
(引用 `__cxa_demangle`),它被 `eh_terminate.o` 的 `std::terminate` 拉入。
|
||
⇒ 在 `Utilities/Src/MemProbe.cpp` 里**自行定义** `__gnu_cxx::__verbose_terminate_handler()`,
|
||
归档成员 `vterminate.o` 不再被拉入,demangler 整体消失。
|
||
应用启动后本来就会 `std::set_terminate` 换成自己的处理函数,行为等效。
|
||
3. `Makefile` 新增 `NO_RTTI=1`(默认开)→ `CXXFLAGS += -fno-rtti`。
|
||
|
||
**实测**
|
||
|
||
| 指标 | 改前 | 改后 | 差 |
|
||
| --- | --- | --- | --- |
|
||
| Release | 890,880 B | **829,440 B** | **−61,440 B** |
|
||
| `.text` | 753,136 B | 703,616 B | −49,520 B |
|
||
| `.rdata` | 36,936 B | 26,616 B | −10,320 B |
|
||
| Debug | 1,801,617 B | 1,734,578 B | −67,039 B |
|
||
|
||
**验证**:release + debug **全量重建**(删 `*.o`/`*.d`)零 error 零 warning;
|
||
map 中 `cp-demangle.o` 已无 `.text` 段分配。
|
||
|
||
### P2 Release 关闭异步展开表 + 修正 Debug 构建参数 —— ✅ 完成(提交 `94fc1c4`)
|
||
|
||
**改动**
|
||
|
||
1. 新增 `RELEASE_ONLY_OPT = -fno-asynchronous-unwind-tables`,**只**加在 Release 的两条
|
||
编译规则上。`-fno-exceptions` 下绝大多数函数不再需要 `.pdata`/`.xdata`。
|
||
* 代价(已评估接受):Release 崩溃时 WER 拿不到可靠调用栈;不打印栈回溯的程序
|
||
功能不受影响,Debug 构建保留完整展开表。
|
||
* `-fno-unwind-tables`(全关)会链接失败,不采用。
|
||
2. **修正真实缺陷**:`DEBUG_OPT = -O0` 定义了却**从未被使用** —— Debug 的两条编译规则
|
||
误用 `$(RELEASE_OPT)`(`-Oz`),且全程没有 `-g`。所谓 "Debug 构建" 其实只是
|
||
"不 strip 的 Release",根本无法调试。现改用 `$(DEBUG_OPT) -g`,链接也加 `-g`。
|
||
|
||
**实测**
|
||
|
||
| 指标 | 改前 | 改后 |
|
||
| --- | --- | --- |
|
||
| Release | 829,440 B | **793,088 B**(−36,352) |
|
||
| `.pdata` | 30,420 B | 12,684 B |
|
||
| `.xdata` | 28,904 B | 10,156 B |
|
||
| Debug | 1,734,578 B | 5,992,064 B(真实 `-O0 -g`,属预期) |
|
||
|
||
**验证**:release 与 debug 均全量重建,零 error 零 warning(`-O0` 下也没有新警告)。
|
||
|
||
### P7 面板状态/滚动量收敛为唯一派发点 —— ✅ 完成(提交 `7a3fefb`)
|
||
|
||
**问题(屎山核心之一)**:`Lane` 里 7 种实验性功能各有 1 份 `LanePanelState` + 1 个滚动偏移
|
||
(14 个字段)。旧实现在**每一处**“按种类取用”的地方各写一遍嵌套三元式或 `switch`:
|
||
`EdgePanelLayoutFor` 5 条 7 层嵌套三元式;标题栏拖拽、✕ 关闭、滚轮、滚动条、错开序数各写一遍。
|
||
新增面板要改 20+ 处,漏一处就是「拖不动 / 关不掉 / 滚轮滚不到底」
|
||
(`MARK`、`RESAMPLE`、`CLIP` 均真实踩过)。
|
||
|
||
**改动**:`PlotViewInternal.hpp` 新增唯一派发点
|
||
`LanePanelEnabled` / `LanePanelStateOf` / `LanePanelScrollOf`(可写 + 只读)。
|
||
这些 `switch` **穷举 7 种且不写 `default:`** ⇒ `-Wswitch` 在漏登记时编译报警
|
||
(已用最小程序验证 `-Wswitch` 确实会报)。
|
||
|
||
调用点:布局 5 条三元式 → 3 行;标题栏拖拽 7 分支 switch → 1 次写入;
|
||
滚轮/滚动条/✕ 关闭/折叠切换全部改为穷举无 `default`。
|
||
|
||
**验证**:release + debug 零 warning;产物 **793,088 B 不变**(等价变换,说明只是结构收敛)。
|
||
|
||
**未做(受验证条件限制)**:尚未把 `EdgePanelLayoutFor` 的 957 行分支整体改成
|
||
“每面板一行元数据表”。原因:没有可用的离屏像素对比工具(`.preflight` 已删除,
|
||
且崩溃会弹模态框),纯逻辑重写无法自证“像素完全一致”。已通过上面的派发收敛
|
||
消除最容易出错的一类重复,剩余重复属于“几何算式本身”,风险高于收益。
|
||
|
||
### P11 拆分 `ApplicationCommands.cpp` —— ✅ 完成(提交 `8437100`)
|
||
|
||
原文件 **2,165 行**,混杂六类职责。按职责**纯搬移**(零逻辑改动):
|
||
|
||
| 新文件 | 行数 | 内容 |
|
||
| --- | --- | --- |
|
||
| `ApplicationTabs.cpp` | 355 | 标签页新建/关闭/切换/重排、视图同步、窗口标题、标签栏回调、标签页右键菜单 |
|
||
| `ApplicationDerive.cpp` | 786 | 派生烘焙、重采样、选区截取(新建/就地)、克隆(含带调整) |
|
||
| `ApplicationMenus.cpp` | 409 | 绘图区右键菜单、菜单数值回写、主题切换、设置菜单、菜单结果派发 |
|
||
| `ApplicationCommands.cpp` | 642 | 分组/信号增删、移动与重排、文件对话框、工具栏动作、键盘鼠标分发、布局边界绘制 |
|
||
|
||
Makefile 按目录通配收集源文件,**无需登记新文件**。
|
||
|
||
**验证**:release 零 error 零 warning;产物 793,088 → 794,112 B(+1,024,LTO 内联边界
|
||
变化,< 0.13%)。
|
||
|
||
### P15 注释/文档校正 —— ✅ 完成(提交 `f139440`)
|
||
|
||
* `PlotView.hpp`:删除指向已删除代码的 `FormulaEnvelopeEntry` 注释块。
|
||
* `agent_mem.md` §2:`-Os` → `-Oz`;补体积开关(`NO_EXCEPTIONS` / `NO_RTTI` / `LTO` /
|
||
`RELEASE_ONLY_OPT`)与「改 Makefile 必须删 `.o` 全量重编」提醒;补 `msimg32`;
|
||
忽略列表补 `Temp/`、`.preflight/`、`Tools/`。
|
||
* `agent_mem.md` §3:目录结构按现状重写(删除不存在的 `CsvTable/`、`DataModel/`、
|
||
`PaintUtil/` 等旧条目;写明 `Components/Shared` 与 `Utilities` 的真实职责和依赖方向)。
|
||
* `agent_mem.md` 末尾新增「第 33 轮」记录。
|
||
|
||
### P16 最终验证与报告 —— ✅ 完成
|
||
|
||
* release(全量)+ debug(全量 `-O0 -g`)**零 error 零 warning**。
|
||
* 最终产物 **794,112 B**(起点 890,880 B,−96,768,−10.9%)。
|
||
* `cp-demangle.o` 已无 `.text` 段分配;`__gnu_cxx::__verbose_terminate_handler`
|
||
定义在本产物内(`0x140057ed1`);导入 DLL 无新增。
|
||
* 报告:`Documents/Code_Review_Report.md`。
|
||
|
||
### 未完成/搁置的节点(均已在报告中说明原因)
|
||
|
||
* **P8** `SceneContentHash` 混入收敛:无逐像素验证手段,合并会改变哈希值,风险不划算。
|
||
* **P9** `EdgePanelLayoutFor` 表驱动化:同上(957 行几何分支,无法自证像素一致)。
|
||
* **P10** 缓存五件套抽象:同上,且热路径复杂。
|
||
* **P12** `PlotView.hpp` 拆分:嵌套类型外移需改 70+ 处引用,收益仅为可读性。
|
||
* **P13/P14** UI 基础层与绘制边界核对:已做**依赖方向与引用统计**,未发现重叠或反向依赖,
|
||
因此不再拆分。
|
||
* **性能项**:未发现新的可复现热点;已记录 3 个"还能再快一点"的点(见报告 §6.2)。
|
||
|
||
|
||
|
||
|