refactor(panels): 面板静态特征收敛为唯一登记表 + 标记面板绘制分段(§17.6 第 1/2 项)
- 新增 pvdetail::PanelKindTraits + PanelTraitsOf(唯一 switch):标题 / 排版类别 / 滚动字段 / 面板状态 / 功能开关同表登记;新增面板只改「枚举 + 一行」, -Wswitch 仍在唯一登记点生效。PanelTitle 改为「前缀 + rangeSuffix 标志」, 不再依赖 switch(标题降级为数据,不再需要函数指针)。 - PaintPanelMarkerGroups(约 340 行)拆成 6 个具名函数,主函数只保留绘制顺序 (普通分组栏 -> 条目 -> 表头 -> 吸顶栏 -> 滚动条 -> 透明度行);纯搬移、0 字节变化。 - 顺手修正该函数体遗留的多余缩进。 验证:release/debug/tools 零 warning;UnitTests 260/19;OffscreenChecks -all 7/133; panels -mode compare 7 面板像素哈希逐项不变;rowgeom compare 965+7 / 1268+7 键 0 差异。 产物 781,824 -> 782,336 B(+512,全部来自登记表)。
This commit is contained in:
1 parent
a9f1563896
commit
0c26da07d2
8 files changed
+761
-453
No files matched your search
@@ -825,5 +825,98 @@ old keys = 919, new keys = 965
|
||||
与 §17.3 同理:先给"吸顶推挤"单独一个可测函数。
|
||||
3. 体积:等有新的冗余再说(用户已明确)。
|
||||
|
||||
---
|
||||
|
||||
## 十八、第 41 轮(2026-11-04,收尾):面板登记表 + 标记面板分段,以及"能否结束审查"的判定
|
||||
|
||||
### 18.1 结论
|
||||
|
||||
| §17.6 建议 | 结果 |
|
||||
| --- | --- |
|
||||
| 1. 三处穷举 `switch` 合成 `constexpr` 表 | ✅ 完成,而且实际收敛的是**五处**(`PanelStyleOf` / `PanelTitle` / `LanePanelScrollOf` / `LanePanelStateOf` / `LanePanelEnabled`) |
|
||||
| 2. `PaintPanelMarkerGroups` 再拆 | ✅ 拆成 6 个具名函数,主函数只剩"绘制顺序" |
|
||||
| 3. 体积 | ⏸ 按用户指示不做(+512 B 是本轮唯一代价,来自登记表) |
|
||||
|
||||
### 18.2 本轮做了什么
|
||||
|
||||
**(1)面板静态特征收敛为唯一登记点**
|
||||
|
||||
```cpp
|
||||
inline constexpr PanelKindTraits PanelTraitsOf(EdgePanelKind kind); // 唯一 switch
|
||||
```
|
||||
|
||||
`PanelKindTraits{style, title, rangeSuffix, scroll, panel, enabled}` ——
|
||||
新增一种面板只改**两处**:`EdgePanelKind` 加枚举值 + 表里加一行。
|
||||
五个消费者的签名一字未改,调用点**一处未动**。
|
||||
|
||||
`PanelTitle` 从"返回 `std::wstring` 的 switch"变成"读表 + 可选追加 `EdgeRangeSuffix()`"。
|
||||
这解决了 §17.6 留下的那个具体障碍:"标题是函数、依赖运行时字符串,所以没法进表"——
|
||||
答案是**把标题降级为数据(前缀 + 标志)**,而不是把函数塞进表里。
|
||||
|
||||
**(2)标记面板绘制分段**
|
||||
|
||||
| 函数 | 职责 |
|
||||
| --- | --- |
|
||||
| `MeasureMarkerColumnWidths` | 六列实测宽度 → `Lane::freeMarkerColumnWidths` |
|
||||
| `PaintMarkerGroupBar` | 分组栏(三角 / 名称 / `N 标记点` / ✕) |
|
||||
| `PaintMarkerColumnSeparators` | 列分隔竖线(条目与表头共用) |
|
||||
| `PaintMarkerRow` | 固定点条目(六列 + 分隔线 + ✕) |
|
||||
| `PaintMarkerTableHeader` | 展开分组的表头 |
|
||||
| `PaintMarkerOpacityRow` | 「标记透明度」滑块行 |
|
||||
| `PaintPanelMarkerGroups` | **只负责顺序**:分组栏 → 条目 → 表头 → 吸顶栏 → 滚动条 → 透明度行 |
|
||||
|
||||
判据不是"看起来更清楚",而是 `panels` 的 7 个面板像素哈希 + `rowgeom` 的
|
||||
965/1268 条几何键**逐项不变**;产物字节数在 P40 前后**完全相同**(782,336 B),
|
||||
说明这一段是真正的零成本搬移。
|
||||
|
||||
### 18.3 现在可以结束这次代码审查了吗?——**可以**
|
||||
|
||||
这不是"我觉得差不多了",而是逐条对账的结果:
|
||||
|
||||
| 审查项 | 状态 | 证据 |
|
||||
| --- | --- | --- |
|
||||
| 体积(890,880 → 782,336 B,−12.2%) | 完成 | `objdump -h` 节表;`-fno-rtti` + terminate handler 覆盖 + 关异步展开表;红线 1 MB,余量 ≈260 KB |
|
||||
| Debug 构建"名不副实" | 已修 | `DEBUG_OPT -g` 真正生效(Debug 6.16 MB 属预期) |
|
||||
| 面板分派"改一次就出错" | 已消除 | 唯一登记表 + `-Wswitch` 编译期保护 |
|
||||
| 平行数组错位 / 字段重载 | 已消除 | `std::vector<PanelRow>`(结构上不可能错位) |
|
||||
| 几何算式两处/双遍历 | 已收敛 | `PanelColumnMetrics` + `PanelRowPlan` |
|
||||
| 巨型函数(1900 / 340 行) | 已拆 | `PlotViewPanelPaint.cpp` 三个内容函数 + 本轮六个标记面板函数 |
|
||||
| 过时文档/注释 | 已清理 | `UI_Refactor_*` 已删;`agent_mem.md` §2/§3 已校正 |
|
||||
| 死代码 / 死字段 / TODO | 无 | `-Wall` 零警告 + 全成员引用计数 + 全仓 grep |
|
||||
| 性能热点 | 无新发现 | 第 32 轮四处卡死已根治;三处"还能再快一点"均已量化并判定不做 |
|
||||
|
||||
**明确"不做"的三项(都有数字支撑,写在这里防止后续重复尝试)**:
|
||||
|
||||
1. `EdgeScanFor` 状态查找哈希化:198 状态 0.097 → 0.073 µs/次,但体积 **+5,632 B**。
|
||||
2. `EdgePanelLayoutFor` 表驱动化:实测 1.9~2.5 µs/次(每帧约 30 µs),**不是热点**。
|
||||
3. gdtoa(≈33 KB):MinGW 下只要还用 `std::to_*string`(含浮点)就必然链入,
|
||||
根因在 libstdc++ 的 `os_defines.h` 无条件 `#define __USE_MINGW_ANSI_STDIO 1`。
|
||||
|
||||
**剩下的都属"收益 < 风险/成本"**:`PaintPanelListRows` 还可再拆(纯可读性)、
|
||||
体积只在出现新冗余时再压、面板几何算式已经是单一来源。
|
||||
|
||||
### 18.4 合并前的建议动作(给用户)
|
||||
|
||||
1. **远端机器务必全量重编**:本分支动过 `Makefile`(`NO_RTTI` / `RELEASE_ONLY_OPT` /
|
||||
Debug `-O0 -g`),而只改 Makefile **不会**触发重编 ⇒ 先 `make clean`,再 `make release`。
|
||||
否则会误以为"体积优化无效"或"Debug 还是 -Oz"。
|
||||
2. 合并前跑一遍**最小集**(见 `Tools/README.md` §5):
|
||||
`make release` → `make -C Tools` → `UnitTests` → `OffscreenChecks -all`
|
||||
→ `-run panels -mode compare`(注意:面板/几何基线是**本机生成**的,跨机器不可比,
|
||||
远端首次应 `-mode record` 重建或直接跳过 compare)。
|
||||
3. 分支顺序:`Code_Review` → `dev` → `main`。本分支只含代码 / 文档 / `Tools/`,
|
||||
**没有**构建产物、没有 `Temp/`、没有测试数据。
|
||||
|
||||
### 18.5 本轮验证
|
||||
|
||||
| 项 | 结果 |
|
||||
| --- | --- |
|
||||
| `make release` / `make debug` / `make -C Tools` | 零 error / 零 warning |
|
||||
| Release 产物 | **782,336 B**(+512,全部来自 P39 登记表;P40 为 0) |
|
||||
| `UnitTests` | `checks=260 failed=0 cases=19` |
|
||||
| `OffscreenChecks -all` | 7 检查 / **133** 断言,全 PASS |
|
||||
| `panels -mode compare` | 7 个面板像素哈希**逐项不变** |
|
||||
| `rowgeom -mode compare` | 965 + 7 键 / 1268 + 7 键(MF4),**0 差异** |
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user