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 性能问题的主要内容,如果未能解决你的问题,请参考以下文章