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

7.7 KiB
Raw Blame History

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)。