InvalidatePlot 上 WPF 中大数据的 OxyPlot 性能问题

Posted

技术标签:

【中文标题】InvalidatePlot 上 WPF 中大数据的 OxyPlot 性能问题【英文标题】:OxyPlot performance issue on larg data in WPF on InvalidatePlot 【发布时间】:2021-01-03 12:11:15 【问题描述】:

我在我的 wpf 应用程序中使用 OxyPlot 作为线路记录器。这就像LiveDemo 示例。 在大型可见数据集上,我遇到了一些 UI 性能问题,并且可能整个应用程序可能会冻结。似乎是 PlotModel.InvalidatePlot 经常被多次调用,但我没有找到更好的方法。

深入:

使用 OxyPlot 2.0.0 我在 PlotModel 中编码。 Xaml PlotView 仅绑定到 PlotModel。 我在线程中循环收集数据并将它们放入 DataSource(List of List 是 LineSeries 的 ItemSoure) 我有一个类,它在线程中循环计算 x 和 y 轴的表示等等。毕竟这些东西,它调用 PlotModel.InvalidatePlot。

如果我

显示屏上有超过 10 万个点(无论是否在多个 LineSeries 中) 每 500 毫秒为每个 LineSeries 添加 1 个数据点 每 200 毫秒调用一次 PlotModel.InvalidatePlot

不仅 PlotView 有性能问题,而且窗口反应很慢,即使我调用 PlotModel.InvalidatePlot (false)。

我的目标

我的目标是让 Windo / 应用程序正常工作。它不应该因为线路记录器而挂断。最好是没有性能问题,但我持怀疑态度。

我发现或测试了什么

OxyPlot 有Performance guidelines。我将 ItemsSource 与 DataPoints 一起使用。我也尝试将它们直接添加到 LineSeris.Points,但无论如何 Plot 都不会刷新(即使使用 ObservableCollection),所以我必须调用 PlotModel.InvalidatePlot,这会产生相同的效果。我无法绑定到 Xaml 中定义的 LineSeries,因为我不知道那里会有多少行。也许我错过了直接添加积分的东西?

我还发现了一个 Github 问题 1286,它描述了一个相关问题,但这种解决方法在我的测试中速度较慢。

我还检查了调用 PlotModel.InvalidatePlot 所经过的时间,但点数不影响它。

我检查了 UI 线程,似乎处理这么多点有问题

如果我放大绘图并显示在 20 k 点以下,它看起来如此

问题:

除了少调用 PlotModel.InvalidatePlot 之外,有没有更好的处理方法?

限制:

我还必须更新轴和注释。所以,我想我不会过来调用 PlotModel.InvalidatePlot。

【问题讨论】:

【参考方案1】:

我发现使用 OxyPlot Windows 窗体实现,然后使用 WPF 中的 Windows 窗体集成显示它可以提供更好的性能。

例如

var plotView = new OxyPlot.WindowsForms.PlotView();
plotView.Model = Plot;

var host = new System.Windows.Forms.Integration.WindowsFormsHost();
host.Child = plotView;

PlotContainer = host;

“Plot”是您调用 InvalidatePlot() 的 PlotModel。

然后在您的 XAML 中:

<ContentControl Content="Binding PlotContainer"/>

或者您想使用 WindowsFormsHost。

【讨论】:

【参考方案2】:

目前我最终计算了下一次调用 InvalidatePlot 的时间。我用这个answer 中给出的方法计算它,它返回可见点的数量。这减少了性能问题,但在调用 InvalidatePlot 时修复了 UI 线程上的块。

【讨论】:

以上是关于InvalidatePlot 上 WPF 中大数据的 OxyPlot 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

云上技术中大型规模企业如何部署多数据中心?

WPF 工具包折线图的性能

生活中大数据分析案例以及背后的技术原理

汇总:生活中大数据分析案例以及背后的技术原理

优化 R 中大 df 的距离 distHaversine 模型

wpf 控件属性通过数据绑定到某个集合的某一个数据上。