DeepSeek V4.1 Flash 79c84edea8 修复开启边沿计数后拖动时间光标卡顿(增量统计)
症状:VERY_BIG_DATA.CSV 全选信号后拖动时间光标,未开启实验性功能时约 13ms/帧很顺畅,
一旦对某个网格开启「边沿计数」或「边沿计数(中心轴)」,拖动就变卡(实测约 24ms / 34ms 每帧)。

根因:两个边沿统计函数的缓存键里包含时间区间(rangeMin/rangeMax)。拖动时间光标时区间
每帧都在变,于是每帧全部缓存失效,对网格内每条可见信号重扫整段区间(亿级采样即数十毫秒);
同时缓存是无上限的 vector,每个新区间都会追加一条,拖一会儿就积累数百条,查找也退化为线性扫描。

修复:缓存键改为「数据分组 + 信号 + 判定基准(横向光标幅值 / 平滑半径)+ 是否限定区间」,
时间区间不再进键;缓存项改为记录「上一次统计的采样下标区间 [begin, end) 与其计数」:
- 区间完全一致 → 直接命中;
- 与上一帧共享一个端点(拖动光标时必然如此)→ 只扫描两端差集并增量加减;
- 两端都变 / 首次统计 / 时间轴非单调 → 整段重算。
另加缓存条目上限(48 条,超出淘汰最早一条),避免长时间拖动导致缓存无界增长。

新增的滑动区间基元 AccumulateEdgeCrossings(pairFirst, pairLast) 统计采样对 k ∈ [pairFirst,
pairLast](每对为 (k-1, k)),起点对的连续性由其前一个采样决定;这样把区间切成互不相交的
若干段分别累加(或从总量中减去)与一次性扫描整段完全等价,是增量加减的正确性依据。

验证(VERY_BIG_DATA、5 信号、双光标、网格 1 开启对应功能、反复拖动时间光标):
- 中心轴边沿计数 33.8ms → 13.3ms/帧;普通边沿计数 24.5ms → 11.3ms/帧;
- 用临时探针把增量结果与「整段重算」逐位比对(两个功能都覆盖),零 MISMATCH;
- 面板数值随拖动实时更新,单光标(无区间)走全信号统计并被缓存,横向光标与面板交互不变。
2026-10-10 09:32:59 +08:00
S
Description
No description provided
5.1 MiB
0 Stars 1 Watchers 0 Forks
Languages
C++ 99.5%
Makefile 0.5%