Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
失效地块WPF中大数据的OxyPlot性能问题_Wpf_Oxyplot - Fatal编程技术网

失效地块WPF中大数据的OxyPlot性能问题

失效地块WPF中大数据的OxyPlot性能问题,wpf,oxyplot,Wpf,Oxyplot,我在wpf应用程序中使用OxyPlot作为测线记录器。就像这个例子。 在一个巨大的可视数据集上,我遇到了一些UI性能问题,可能整个应用程序都会出现问题。这似乎是PlotModel.InvalidatePlot,它经常被调用,但我没有找到更好的方法 在深层次上: 使用OxyPlot 2.0.0 我在PlotModel中编写所有代码。Xaml PlotView仅绑定到PlotModel 我在线程中收集数据并将其放入数据源(LineSeries的ItemSoure列表) 我有一个类,它计算一个线程中

我在wpf应用程序中使用OxyPlot作为测线记录器。就像这个例子。 在一个巨大的可视数据集上,我遇到了一些UI性能问题,可能整个应用程序都会出现问题。这似乎是PlotModel.InvalidatePlot,它经常被调用,但我没有找到更好的方法

在深层次上:
  • 使用OxyPlot 2.0.0
  • 我在PlotModel中编写所有代码。Xaml PlotView仅绑定到PlotModel
  • 我在线程中收集数据并将其放入数据源(LineSeries的ItemSoure列表)
  • 我有一个类,它计算一个线程中的周期,x轴和y轴的表示,以及更多。完成所有这些之后,它调用PlotModel.InvalidatePlot
如果我

  • 显示器上的点超过100 k(无论是否在多个线系列中)
  • 并每500毫秒为每个线系列添加1个数据点
  • 并每隔200毫秒调用PlotModel.InvalidatePlot
不仅PlotView存在性能问题,即使调用PlotModel.InvalidatePlot(false),窗口的反应也非常缓慢

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

我所发现或测试的 OxyPlot已经成功了。我正在使用ItemsSource和数据点。我还尝试将它们直接添加到LineSeris.Points中,但绘图不会刷新(即使使用ObservableCollection),因此我必须调用PlotModel.InvalidatePlot,这会产生相同的效果。我无法绑定到Xaml中定义的LineSeries,因为我不知道会有多少行。也许我错过了直接加分的机会

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

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

我已经检查了UI线程,它似乎很难处理这么多的点

如果我放大到绘图并显示在20 k点以下,看起来是这样的

问题: 除了少调用PlotModel.InvalidatePlot之外,还有其他更好的方法吗?

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

因为我最后计算了下次调用InvalidatePlot的时间。我用本文给出的方法计算它,它返回可见点的数量。这重新减少了性能问题,但在调用InvalidatePlot时修复了UI线程上的阻塞。

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

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

e、 g

其中“Plot”是调用InvalidatePlot()的PlotModel

然后在XAML中:

<ContentControl Content="{Binding PlotContainer}"/>


或者您想使用WindowsFormsHost。

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

e、 g

其中“Plot”是调用InvalidatePlot()的PlotModel

然后在XAML中:

<ContentControl Content="{Binding PlotContainer}"/>

或者您希望使用WindowsFormsHost的其他方式