深度修复实验性功能预览曲线导致的交互卡顿(平移/拖滑块/缩放/改样式不跟手)

根因:派生预览曲线按可见采样窗口计算,代价正比于窗口采样数(弱波增强整段 2576 万采样单条约 368ms);旧策略对超过 4M 采样的窗口不缓存,导致大跨度下每帧(含悬停重绘)重算整段曲线;拖滑块每帧改参数即每帧重算。实测弱波增强整段拖滑块单帧约 2303ms,2.5s 跨度约 89ms。

修复:1) 大窗口也进缓存并按总字节预算淘汰(静止重绘 2247ms-0.25ms);2) 交互期间对超出预算的大窗口延迟重算、复用旧曲线(拖滑块 2303ms-18ms),小窗口仍实时重算;3) 计算缓冲改 thread_local 复用容量。仅改何时计算与是否缓存,几何与取值算法不变,逐像素比对 0 差异。

缩放等级差异:整段放大时窗口为整条信号(千万级)每帧重算故最卡;极小跨度窗口仅几千采样故不卡;中间跨度几十毫秒亦卡。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-11 11:32:58 +08:00
1 parent 2f7a6bc2d2
commit aca84df0ac
4 files changed
+138 -19

No files matched your search

+6 -1
View File
@@ -1264,12 +1264,17 @@ namespace jdi
* @param [IN] begin 需要的采样区间起点(含)。
* @param [IN] end 需要的采样区间终点(不含)。
* @param [OUT] spanBegin 返回数组对应的首个采样下标。
* @param [IN] allowInteractiveDefer 交互期间是否允许「延迟重算」:窗口过大时复用已算好的
* 旧曲线,避免在拖动滑块/移动视界时同步重算整条曲线(见
* `kDerivedInteractiveComputeBudget`)。仅供**预览绘制**传 true;
* 需要精确取值的统计(中心轴边沿计数)必须传 false。
* @return 曲线数组指针(覆盖 `[spanBegin, spanBegin + size())`);无法计算时返回 nullptr。
*/
const std::vector<float>* CurveSpanFor(DerivedCurveKind kind, const SignalData& signal,
int points, int iterations, int levelPercent,
std::size_t begin, std::size_t end,
std::size_t& spanBegin) const;
std::size_t& spanBegin,
bool allowInteractiveDefer = false) const;
/**
* @brief 计算当前视图对应的采样下标区间(时间单调时二分定位,否则为整段)。