79c84edea8cd8f629efa364c2ba3494b23c02a23
症状: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; - 面板数值随拖动实时更新,单光标(无区间)走全信号统计并被缓存,横向光标与面板交互不变。
Languages
C++
99.5%
Makefile
0.5%