【问题标题】:ScottPlot and WPF background renderingScottPlot 和 WPF 背景渲染
【发布时间】:2022-10-24 23:07:48
【问题描述】:

ScottPlot 用于显示具有 10'000 多个数据点的实时图表。

数据点每秒钟添加一次,因此需要更新图表。

计时器每秒执行一次刷新,但是,它会将整个 UI 冻结几毫秒,这很烦人。

ScottPlot 确实有一个非阻塞的Chart.RenderRequest(); 方法,但图表仍呈现在 UI 线程上,因此无法解决问题。

当然,如果我们尝试从后台工作人员刷新它,就会发生线程异常。

    var bg = new BackgroundWorker();

    bg.DoWork += (s, e) =>
    {
        Chart.RenderRequest();
    };
    bg.RunWorkerAsync();

有什么方法可以使用 WPF 和 ScottPlot 在单独的线程中呈现图表?

编辑:

是否进行了时序分析,Refresh、Render、RefreshRequest、RenderRequest 都具有相似的执行时间,尽管“请求”被认为是非阻塞的。

【问题讨论】:

  • 没有。不能在另一个线程上呈现控件。如果可以通过简单地添加新图来实时更新整个图表,那么刷新整个图表似乎是个坏主意。
  • 这就是它在文档中的完成方式

标签: c# wpf scottplot


【解决方案1】:

前段时间我遇到了类似的问题。

我有很多数据要显示在多个图表中,我发现(在我看来)获得令人满意的用户体验的一个可接受的限制是将 scottplot 呈现的数据限制在大约 100 万个点。 这里有一些提示可能可以帮助您解决问题。

  • 如果可以,请使用SignalXY 绘图。它旨在渲染大量数据,因此渲染速度比使用任何其他类型的图形要快得多。

  • 不幸的是,您必须在 UI 线程中呈现图形,但您可以将 UI 线程的使用限制为调用 wpfPlot.Refresh()。创建数据可以具有的最大大小的一对双精度数组 double[] Ys 和 Xs[]。创建所需类型的绘图并将实例作为类变量保留在您的类中(其他绘图元素也是如此,如十字准线或图例)。当您需要更新数据时,只需更改 Ys 和 Xs 的值。不要在 scottplot wpfPlot 中添加和删除图。
    我在下面写一个小例子,只是为了给你一个想法:

     double[] times;
     double[] values;
     SignalXY plot;
     private void Initialize()
     {
       wpfPlot.Plot.Clear(); //This removes all plottables
       times = new double[MaxSamples];
       values = new double[MaxSamples];
       plot = wpfPlot.Plot.AddSignalXY(times,values);
     }
    
     private void UpdatePlot()
     {
       int counter=0;
       foreach(var data in myData)
       {
         times[counter] = data.Time;
         values[Counter = data.Value;
         counter++;
       }
       //This tells to scottplot to render only until the index counter, so you 
       //can have a bigger Xs arrays that can be created only at the beginning
       plot.MaxRenderIndex=counter;
    
       //This call must be done in UI thread
       wpfPlot.Refresh();
     }
    

对我来说,这两个变化大大提高了渲染性能。希望这对你也有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多