首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScottPlot和WPF背景渲染

ScottPlot和WPF背景渲染
EN

Stack Overflow用户
提问于 2022-10-19 13:04:43
回答 1查看 103关注 0票数 1

ScottPlot用于显示10,000多个数据点的实时时间图。

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

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

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

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

代码语言:javascript
复制
    var bg = new BackgroundWorker();

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

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

编辑:

时间分析,刷新,渲染,RefreshRequest,RenderRequest都有相似的执行时间,尽管“请求”被认为是非阻塞的。

EN

回答 1

Stack Overflow用户

发布于 2022-10-24 15:07:48

不久前,我遇到了一个类似的问题。

我有大量的数据要显示在多个图表,我发现(在我的能力)一个可以接受的限制有一个令人满意的用户体验是限制的数据呈现约100万点。这里有一些建议,也许可以帮助你解决你的问题。

  • 如果可以的话,可以使用SignalXY绘图。它被设计成呈现大量数据,因此呈现比使用任何其他类型的图形要快得多。
  • 不幸的是,您必须在UI线程中呈现图形,但是可以将UI线程的使用限制在调用wpfPlot.Refresh()上。创建一对数据最大大小的双数组double[]、Ys和Xs[]。创建所需类型的绘图,并将类中的实例保持为类变量(对于其他可绘制元素,如十字或图例),情况相同。当您需要更新数据时,只需更改Ys和Xs的值即可。不要添加和删除wpfPlot中的图表。 我在下面写了一个小例子,只是想给大家一个想法: double[]时间;double[]值;SignalXY绘图;私有void (){ wpfPlot.Plot.Clear();//移除所有可处理的时间=新的doubleMaxSamples;值=新的doubleMaxSamples;doubleMaxSamples=wpfPlot.Plot.AddSignalXY(时间、值);}私有的void (){ int counter=0;foreach(var data in myData) { timescounter = data.Time;values[Counter = data.Value;counter++;}//这告诉scottplot只能呈现到索引计数器,所以您//可以有一个更大的Xs数组,只能在plot.MaxRenderIndex=counter开头创建;//此调用必须在UI线程wpfPlot.Refresh();}中完成。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74125844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档