优化百万级采样文件的绘制性能,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:
1 parent
12b3531485
commit
d6a81839bb
3 files changed
+312
-20
No files matched your search
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user