我们有几个图表显示来自表面EMG传感器的过滤数据。此数据通过TCP接收并使用事件传播。数据包是DataPackets类型,因此被过滤掉了。我正在使用缓冲区让数据包以30FPS通过。我正在使用Reactive Extensions监听此事件,如下所示:
Observable.FromEvent<Packet>(h => this.DataService.PacketReceived += h, h=> this.DataService.PacketReceived -= h)
.OfType<DataPacket>()
.Buffer(TimeSpan.FromSeconds(1.0 / 30))
.ObserveOnDispatcher()
.Subscribe(
packet => this.ReceiveDataPackets(packet.ToList()),
err => this.Log.Error("Error subscribing to data packets", err),
() => this.Log.Info("Finished listening to data packets"));
要显示EMG数据,我们使用Telerik ChartView。我遇到的问题是数据更新不顺畅,图表不稳定。
可能有几个原因:
通过对输入数据进行采样来解决点1,使得图中仅可见1000个点。
遗憾的是,点2无法解决。我尝试将优先级提高到渲染,但这根本没有帮助。 http://social.msdn.microsoft.com/Forums/en-US/5eea6700-1c79-4da6-9b68-efa480ed3a36/simplify-wpf-dispatcher-calls?forum=rx
第3点与第2点相关。我尝试使用System.Debug.Stopwatch
使用定时队列解决这两个问题。 DataPackets包含一个时间戳,用于在Dispatcher线程上以恒定速率通过它们。我怀疑这不会有太大帮助,因为DispatcherRate没有链接到渲染的刷新率。
我该怎么做才能减少波动?我尝试过LightningChart Ultimate,它应该要快得多。它确实具有更好的性能,并且不需要进行任何采样,它可以渲染每个数据点。随LightningChart提供的样本运行黄油顺利,但他们在主线程中读取他们的数据。当我在我们的多线程程序中实现他们的图表时,它仍然受到第2点和第3点的组合(以及它比Telerik chartview更昂贵的事实。)
[更新]
经典错误。我的数据源使用DispatcherTimer来收集数据。将此更改为Observable.Interval可大幅提高性能。
我有图表控制a while ago类似的麻烦。我也发现大多数图表控件都无法处理1000多个数据点。我还发现尝试让它每秒重新渲染超过5-15次对于调度员来说非常困难。
我建议你的事情是:
ToList()
并在另一个线程上做。另外,不要发送要处理的空列表(如果适用于您的活动)Observable.FromEvent<Packet>(h => this.DataService.PacketReceived += h, h=> this.DataService.PacketReceived -= h)
.OfType<DataPacket>()
.Buffer(TimeSpan.FromSeconds(1.0 / 8)) //Reduce the FPS
.Select(packet=>packet.ToList()) //Reduce work done on dispatcher
.Where(packet=>packet.Count>0) //Dont send empty sets to dispatcher
.ObserveOnDispatcher()
.Subscribe(
packet => this.ReceiveDataPackets(packet),
err => this.Log.Error("Error subscribing to data packets", err),
() => this.Log.Info("Finished listening to data packets"));
我不确定它是否有帮助,但这是another link来自演示文稿的一些代码。演示文稿的一部分是关于如何通过Rx将数据流式传输到WPF图表。你可能会撕掉整件事。
我知道这是一个老问题,但它可能会对这里的某些人有所帮助。
如果您想在WPF图表中显示来自传感器的数据,那么如果您使用标准的开源图表组件或大多数商业供应商(如Telerik),它将会非常慢。
我想建议我自己的组件:SciChart,它在WPF中以毫秒更新显示数百万个点。
SciChart是一个商业组件,我想透露的是,我是所有者,但是,在可用性或性能方面,没有任何免费或开源替代品可以接近它。
请查看页面Why SciChart - the Best WPF Chart,因为它有一些您可以查看的特定性能演示/视频。它支持多线程数据更新,可以应对1,000点/秒。