预览曲线改为按整条信号计算(与构建为新信号逐位一致);新增平移装饰层缓存消除拖拽卡顿

1) 预览曲线(均值滤波/中心轴/弱波增强)不再按可见窗口近似,统一按整条信号计算,与 BuildDerivedSignal 调用同一函数、同一段数据,逐位一致(用户要求预览与构建结果一致);整段窗口超门槛时交后台计算。
2) 新增装饰层(图例 + Y 轴刻度)像素缓存:实测整幅重绘中二者合计过半,却与时间轴视图无关。全质量帧捕获、拖拽快速帧贴回,仅捕获装饰矩形本身(无鬼影);用不含派生参数的 SceneDecorHash 校验。2ms/大格拖拽平移 13ms→约 5ms。
3) 后台任务按 (信号,曲线种类) 去重、以最新参数为准,避免拖滑块每帧入队整段任务淹没线程池。
4) 后台线程优先级低于正常,UI 优先获得 CPU。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-11 15:33:37 +08:00
1 parent 709cbe4a87
commit 389b4ec2cf
3 files changed
+289 -32

No files matched your search

+48 -1
View File
@@ -1894,9 +1894,10 @@ namespace jdi
* 都会改变该指纹,从而让静态场景缓存自动失效,无需在各处手工调用失效接口。
*
* @param [IN] includeStyles 是否把逐信号外观样式(颜色/不透明度/线宽/模式)计入指纹。
* @param [IN] includeDerived 是否把派生预览曲线的开关与参数计入指纹。
* @return 指纹值。
*/
std::uint64_t SceneContentHash(bool includeStyles = true) const;
std::uint64_t SceneContentHash(bool includeStyles = true, bool includeDerived = true) const;
/**
* @brief 场景内容中**不含逐信号外观样式**的指纹。
@@ -1913,6 +1914,16 @@ namespace jdi
*/
std::uint64_t SceneGeometryHash() const;
/**
* @brief 装饰层(图例 + Y 轴刻度)的指纹:含外观样式,但**不含派生曲线参数**。
*
* 拖弱波增强等级/迭代次数滑块时,图例与 Y 轴刻度不变,仅网格内预览曲线变化;
* 因此装饰层缓存不应因参数变化而失效(否则拖滑块每帧都要重绘图例与刻度)。
*
* @return 指纹值。
*/
std::uint64_t SceneDecorHash() const;
/**
* @brief 静态场景缓存中"网格内信号外观样式"的快照条目。
*/
@@ -2124,6 +2135,42 @@ namespace jdi
*/
bool m_sceneDegraded = false;
// ---- 「装饰层」像素缓存(水平平移时不变的内容:Y 轴刻度胶囊 + 图例)----
// 平移会让视图每帧变化 → 静态场景缓存必然失效 → 每帧都要重画波形**以及**网格线、
// Y 轴刻度文字、图例(实测后者占整幅重绘的一半以上)。但这些装饰内容**只取决于网格几何与
// 信号外观,与时间轴视图无关**,平移时不变化。因此在每张「全质量帧」后把装饰区域的像素
// 捕获下来,拖拽(快速帧)时直接贴回,省去每帧重绘文字与圆角底板的开销。
// 仅在完全相同(`m_decorKey` 命中)时启用,避免几何/外观变化时用到过期像素。
/**
* @brief 确保装饰缓存位图尺寸正确(不足则重建)。
* @param [IN] width 位图宽度。 @param [IN] height 位图高度。
* @return 可用返回 true。
*/
bool EnsureDecorCache(int width, int height);
/** @brief 释放装饰缓存位图。 */
void ReleaseDecorCache();
/**
* @brief 把本帧记录下来的装饰矩形从后备缓冲区捕获进装饰缓存。
* @param [IN,OUT] g 绘图上下文。 @return 捕获成功返回 true。
*/
bool CaptureDecorCache(gd::Graphics& g);
/**
* @brief 把装饰缓存里的装饰贴回后备缓冲区(快速帧用)。
* @param [IN,OUT] g 绘图上下文。 @return 贴图成功返回 true。
*/
bool BlitDecorCache(gd::Graphics& g);
mutable HDC m_decorDc = nullptr; /**< 装饰缓存设备上下文。 */
mutable HBITMAP m_decorBitmap = nullptr; /**< 装饰缓存位图。 */
mutable HGDIOBJ m_decorOldBitmap = nullptr; /**< 装饰 DC 原选位图。 */
mutable int m_decorW = 0; /**< 装饰缓存宽度。 */
mutable int m_decorH = 0; /**< 装饰缓存高度。 */
mutable bool m_decorValid = false; /**< 装饰缓存内容是否有效。 */
mutable std::uint64_t m_decorKey = 0; /**< 装饰缓存对应的内容指纹。 */
mutable bool m_useDecorCache = false; /**< 本帧是否跳过绘制装饰、改用缓存贴回。 */
/** 本帧需要捕获 / 贴回的装饰矩形(各网格的 Y 轴胶囊与图例带)。 */
mutable std::vector<gd::RectF> m_decorRects;
/**
* @brief 实验性功能浮动面板的像素图层项。
*