优化百万级采样文件的绘制性能,Esc 改为取消拖拽选区

性能(BIG_DATA.csv 128 万采样 × 10 信号全显示,实测):
- 折线抽稀改为按像素列取上下包络(min/max),顶点数由固定 20000 降到像素量级;
  既保住尖峰(等间隔抽样会整段漏掉),又不再把大量顶点堆在同一像素列上。
- 新增折线顶点缓存:以“构建折线实际读取的全部输入”(信号、时间轴范围、绘图区横向
  几何、网格纵向几何)为键,视图未变化时直接复用,重复绘制不再重算全量采样。
- 悬停命中检测先按 x 二分裁剪到容差范围内的一小段(点到线段距离必不小于横向距离),
  鼠标移动不再遍历上万个顶点。
- 结果:整帧渲染 1309ms -> 103~127ms(10 网格);折线构建 25ms -> 0ms(缓存命中);
  单条折线绘制 1255ms -> 45~53ms;悬停命中 ~0ms。两文件 6 网格场景约 52ms。
- 未引入多线程:耗时集中在 GDI+ 单线程绘制调用与一次性 O(N) 包络扫描,
  并行化的收益上限仅约 25ms,不值得引入线程与同步复杂度。
- 空闲(无交互)CPU 占用实测 0.00%,消息循环阻塞在 GetMessage,
  无需重绘时不再产生任何计算。

Esc 行为:
- 缩放拖拽(时间轴/幅值轴框选)按住左键时按 Esc:立即放弃选区并清空拖拽状态,
  随后松开左键也不会把选区应用到视图(已验证:时间轴保持原范围,对照组正常缩放)。
- Esc 不再关闭时间光标(原先 Esc 会调用 DisableCursor);关闭光标只走工具栏「光标」按钮,
  避免顺手按 Esc 时意外关掉指针。
- 数据层结构变化(加载/移除文件、切换上下文)后清空折线缓存,
  防止旧几何键与新信号重合而取到过期顶点。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-09-30 17:49:36 +08:00
1 parent 12b3531485
commit d6a81839bb
3 files changed
+312 -20

No files matched your search

+8 -2
View File
@@ -424,6 +424,9 @@ namespace jdi
m_dataSet.ValidateSelection();
m_panel.InvalidateRows();
// 文件/信号结构变化会让信号引用与文件地址改变,折线顶点缓存必须作废。
m_plot.InvalidatePolylineCache();
// 强制下一次同步重新计算视图状态。
m_cachedVisibleCount = -1;
m_cachedAnyVisible = false;
@@ -867,8 +870,11 @@ namespace jdi
switch (key)
{
case VK_ESCAPE:
m_plot.DisableCursor();
return true;
// Esc 只用于放弃当前正在进行的拖拽(典型场景:缩放的框选选区还没松开左键)。
// 取消后不应用选区、视图范围保持不变;松开左键也不会再生效(拖拽模式已复位)。
// Esc 不再与时间光标关联:关闭光标请用工具栏「光标」按钮或再次点击该按钮,
// 避免用户按 Esc 时意外把指针关掉。
return m_plot.CancelDrag();
case VK_ADD:
case VK_OEM_PLUS:
m_plot.ZoomTimeStep(1.4);