Files
Just-DataInspector/Documents/Code_Review_Progress.md
T
DeepSeek-V4.1-Flash c5d7a6fb91 docs(review): 新增 Code Review 最终报告
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 与“搁置节点”的原因说明。
2026-11-04 03:08:45 +08:00

151 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)。