悬停高亮恢复旧版外延观感 + 支持 MATLAB .mat(v7.3 / HDF5,嵌套分组)
一、悬停高亮「几乎看不到、只是曲线换了颜色」(对比提交f845616的旧版观感) 根因:调色板第 1 色就是主题强调色(0xFF268BD2),而上一轮为提速把稠密信号的光晕改成 「按包络带原始几何 FillPath」——与曲线**逐像素同形**,于是曲线上的那层半透明强调色 完全看不出变化;旧版观感来自「lineWidth+4 的描边笔向两侧各外扩 2~3px」。 修法(PlotViewPaint.cpp::PaintSignalHaloFor): 1) 逐列成对填四边形,上下左右都外扩 grow = (lineWidth + 4) * scale / 2 (竖向跃变处旧版 5px 笔涂出的正是那条整高色带); 2) 不能把整条包络拼成一个多边形:满幅方波相邻列区间互相交叉,缠绕填充规则会在交叠处 相互抵消 ⇒ 填充变成一条条竖缝(实测只覆盖约一半带宽); 3) alpha 从 0x55 调回 0x66(与旧版描边笔一致)。 代价仍只在「换信号/换视界/改样式」时付一次,此后每帧只 AlphaBlend。 三维对照(新增 haloshot 探针 +f845616工作树构建):变化像素 旧 73726 / 上一轮 13529 / 本轮 74916,目视与旧版一致(跃变处的整高色带恢复)。 二、MATLAB .mat(v7.3 = HDF5)支持,含嵌套分组 新增只读 HDF5 子集(不引第三方库):Utilities/Inc/MatH5.hpp + Utilities/Src/MatH5.cpp - 超级块 v0/v2;对象头 v1(含续块,主块长度以 headerSize 为准);符号表(B-tree v1 + 本地堆)与 link 消息;数据空间 v1/v2;数据类型 v1;数据布局 v3(紧凑/连续/分块); 分块数据集支持 deflate(zlib);地址一律相对基地址解析。 新增 MATLAB 语义层:Utilities/Inc/MatLoader.hpp + Utilities/Src/MatLoader.cpp 1) Simulink SDI / SimulationData.Dataset(识别 #refs# + #sigstream#): · #refs# 元素有 ElementType(signal/dataset)、Name、Values; · timeseries 的 Values/DataR2、Values/TimeR2 是 #sigstream#/<n> 的流编号; #data# 是 uint8 字节流,按 8 字节一组解释为 double(与 #length#/#sampleSize# 一致); · 子数据集的 Values 是对象引用数组(子元素)⇒ 还原嵌套树; · 分组名 = 从根到信号的各级数据集名用 - 连接(如 A/A1/XYZ → 组 A-A1、信号 XYZ), 信号名取元素 Name(空则退回 timeseries 的 Name,再退回 信号N)。 2) 普通 v7.3 变量:顶层数值矩阵按「列 = 信号、行 = 采样」读取(时间轴 = 采样序号), 结构体按字段递归。 加载管线扩成多分组:新增 LoadSignalSourceGroups()(DataLoader)→ AsyncLoadState::groups → Application::LoadFile 逐个 AddGroup;其它格式仍只有一个分组。 文件对话框与 IsSupportedSignalFile 增加 .mat。 三、验证(全部离屏,不占用鼠标/键盘/屏幕) - 新增 haloshot(截图对照 f845616)、matcheck(15/15:4 组 8 信号、时间轴单调、采样数正确)、 matui(11/11:Application::LoadFile 端到端把 4 个分组加进数据层与信号列表); - 回归 verify 49/49、panelanim 158/158、gridanim 93/93、hoverdrag 20/20、lanescroll 23/23、 datacheck 69/69、edgecheck 46/46、errcheck 19/19、halocheck 16/16、panflash 19/19、 panelstutter 8/8、stress 6/6; - make release / make debug 零警告;Makefile 与探针构建脚本补 -lz。 文档:Documents/agent_mem.md 追加本轮小节(含 4 条新规则:叠加层必须自带外扩、 缠绕填充不可用于自交包络带、HDF5 主消息块长度看 headerSize、 MATLAB 分块维度可能比数据空间多一维、按右侧补 1 对齐)。
This commit is contained in:
1 parent
24f0bf849d
commit
5b24dacee0
12 files changed
+1831
-47
No files matched your search
@@ -6194,3 +6194,81 @@ else if (panelOnly) { /* 只回送“本帧重绘过的区域并集” */ }
|
||||
3. **"面板只有文字却卡顿"多半不是文字本身的锅**:先量"每行成本 × 可见行数",
|
||||
再量"这一帧是否顺带在做绘图区的重活"(图层预热 / 队列排空)。
|
||||
4. **动画帧里绝不做可延迟的整帧级工作**(图层重建、队列排空);这类工作一律推迟到动画之后。
|
||||
|
||||
---
|
||||
|
||||
## 本轮(2026-10-18 第三轮):悬停高亮恢复旧版观感 + 支持 MATLAB `.mat`(v7.3 / HDF5)
|
||||
|
||||
用户报告:① 全部信号分网格显示时,鼠标悬停的高亮「几乎看不到、就像曲线换了个颜色」,
|
||||
只有放大到一定程度(走折线描边路径)才是旧版效果 —— 要参考提交 `f845616` 的观感;
|
||||
② 需要支持 `TestData/data-sample.mat`(`Simulink.sdi.view` 导出的 `timeseries`),
|
||||
并且**嵌套分组**要变成多个组(`A/A1/XYZ` → 组名 `A-A1`、信号 `XYZ`)。
|
||||
|
||||
### A. ① 的根因:包络带光晕与曲线**逐像素同形**
|
||||
|
||||
调色板第 1 色**就是主题强调色**(`0xFF268BD2`),所以「用强调色给曲线上一层半透明」在
|
||||
曲线像素上完全看不出变化。旧版之所以有「外延描边」,是因为它用 `lineWidth + 4` 的笔
|
||||
沿折线描粗 —— **笔画向两侧各外扩 2~3px**,而那圈外扩落在背景上才显眼。
|
||||
|
||||
上一轮为提速把光晕改成「按包络带原始几何 `FillPath`」,正好丢掉了这圈外扩 ⇒ 用户看到
|
||||
「只是曲线换了个颜色」。本轮(`PlotViewPaint.cpp::PaintSignalHaloFor`):
|
||||
1. **逐列成对填四边形**,上下各外扩 `grow = (lineWidth + 4) * scale / 2`,左右也外扩 `grow`
|
||||
(竖向跃变处旧版 5px 笔涂出的正是那条整高色带,只填 1px 列区间看不出来);
|
||||
2. **不能把整条包络拼成一个多边形**:满幅方波的相邻列区间互相交叉,缠绕填充规则会在
|
||||
交叠处相互抵消 ⇒ 填充变成一条条竖缝(实测只覆盖约一半带宽);
|
||||
3. alpha 从 `0x55` 调回 **`0x66`**(与旧版描边笔一致)。
|
||||
|
||||
代价:光晕仍然只在「换信号 / 换视界 / 改样式」时重建一次(~40ms),此后每帧只 `AlphaBlend`
|
||||
(~2ms)。三维校验(新增 `haloshot` 探针 + `f845616` 工作树对照构建):
|
||||
|
||||
| 版本 | 变化像素 | 覆盖外延 |
|
||||
| --- | --- | --- |
|
||||
| f845616(旧版) | 73726 | 有(跃变处整高色带) |
|
||||
| 上一轮 | 13529 | 无(只有带宽内部) |
|
||||
| 本轮 | 74916 | 有(与旧版逐像素目视一致) |
|
||||
|
||||
### B. ② MATLAB 7.3 `.mat`(HDF5)支持
|
||||
|
||||
`MATLAB 7.3` 的 `.mat` 文件头是 `HDF5`(user block 512 字节)。项目不引入第三方库,
|
||||
新增两个文件实现**只读 HDF5 子集**:
|
||||
- `Utilities/Inc/MatH5.hpp` + `Utilities/Src/MatH5.cpp`:超级块 v0/v2、对象头 v1(含续块)、
|
||||
符号表(B-tree v1 + 本地堆)与 link 消息、数据空间 v1/v2、数据类型 v1、数据布局 v3
|
||||
(紧凑 / 连续 / 分块),分块数据集支持 **deflate**(zlib)。
|
||||
- `Utilities/Inc/MatLoader.hpp` + `Utilities/Src/MatLoader.cpp`:MATLAB 语义层。
|
||||
|
||||
两类内容:
|
||||
1. **Simulink SDI / `SimulationData.Dataset`**(识别 `#refs#` + `#sigstream#`):
|
||||
- `#refs#` 里的每个元素有 `ElementType`(`signal` / `dataset`)、`Name`、`Values`;
|
||||
- 信号(`timeseries`)的 `Values/DataR2`、`Values/TimeR2` 是 **`#sigstream#/<n>` 的流编号**
|
||||
(数据流与时间流成对出现);`#data#` 是 `uint8` 字节流,按 8 字节一组解释为 double,
|
||||
长度与 `#length#`/`#sampleSize#` 一致;
|
||||
- 子数据集元素的 `Values` 是**对象引用数组**(子元素),据此还原嵌套树;
|
||||
- **分组名 = 从根到信号的各级数据集名用 `-` 连接**(用户 2026-10-18 要求),
|
||||
信号名取元素的 `Name`(空则退回 timeseries 的 `Name`,再退回 `信号N`)。
|
||||
2. **普通 v7.3 变量**:顶层数值矩阵按「列 = 信号、行 = 采样」读取(时间轴 = 采样序号),
|
||||
结构体按字段递归。
|
||||
|
||||
`BuildSignalGroup` 只能产出一个分组,因此把加载入口扩成**多分组**:
|
||||
`LoadSignalSourceGroups()`(`DataLoader`)→ `AsyncLoadState::groups` → `Application::LoadFile`
|
||||
逐个 `AddGroup`;其它格式仍然只有一个分组(名字取文件名)。
|
||||
|
||||
### C. 验证(全部离屏,不占用鼠标/键盘/屏幕)
|
||||
|
||||
- 新增 `haloshot`(截图探针,与 `f845616` 工作树对照:旧/新变化像素 73726 / 74916);
|
||||
- 新增 `matcheck`(15/15):4 个分组、8 条信号、时间轴单调、采样数正确;
|
||||
- 新增 `matui`(11/11):`Application::LoadFile` 端到端把 4 个分组加进数据层与信号列表;
|
||||
- 回归:`verify` 49/49、`panelanim` 158/158、`gridanim` 93/93、`hoverdrag` 20/20、
|
||||
`lanescroll` 23/23、`datacheck` 69/69、`edgecheck` 46/46、`errcheck` 19/19、
|
||||
`halocheck` 16/16、`panflash` 19/19、`panelstutter` 8/8、`stress` 6/6;
|
||||
- `make release` / `make debug` 零警告;Makefile 与探针构建脚本均补 `-lz`。
|
||||
|
||||
### D. 教训(新增规则)
|
||||
|
||||
1. **「高亮/选中」这类叠加层必须自己带"外扩"**:若叠加色恰好等于元素本身的颜色,
|
||||
逐像素同形的填充等于没有效果;旧实现的观感来自**描边笔宽**,等效做法是几何外扩半个笔宽。
|
||||
2. **缠绕填充规则( winding )不能用于自交的包络带**:相邻列区间交叉时正负缠绕会抵消,
|
||||
必须逐列成对填充(每段都是简单多边形)。
|
||||
3. 读 HDF5 时**对象头里的 `headerSize` 才是主消息块的长度**(消息数只是总数),
|
||||
否则消息多、需要续块的对象会读到块外垃圾,字段全部解析失败。
|
||||
4. MATLAB 写出的**分块维度可能与数据空间维度维数不同**(1 维数据集的分块是 `[N,1]`),
|
||||
按"右侧补 1"对齐即可解码。
|
||||
Reference in new issue
Block a user