c# - 从多线程数据源平滑更新图表

标签 c# wpf graph telerik system.reactive

我们有几张图表显示来自表面 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. Telerik 图表速度不够快,无法每秒处理 1000 个数据点
  2. DispatcherTimer 不会以恒定速率触发
  3. 数据不是以恒定速率接收的

点 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 可显着提高性能。

最佳答案

我知道这是一个老问题,但它可能会对这里的人有所帮助。

如果您想在 WPF 图表中显示来自传感器的数据,如果您使用标准的开源图表组件或大多数商业供应商(如 Telerik),速度会非常慢。

我想推荐我自己的组件:SciChart ,它在 WPF 中以毫秒为单位显示数百万个点。

SciChart 是一个商业组件,我想透露是的,我是所有者,但是,在可用性或性能方面,没有任何免费或开源替代品可以接近它。

请看页面Why SciChart - the Best WPF Chart因为这有一些您可以查看的特定性能演示/视频。支持多线程更新数据,可应对1000点/秒。

关于c# - 从多线程数据源平滑更新图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19223837/

相关文章:

c# - 如何在 XML 文档的特定位置添加 XElement

wpf - 当 AutoGenerateColumns ="True"时如何使数据网格的特定列成为组合框

c# - 如何从其子控件访问 ListViewItem?

python - 从文本文件解析为图形(python)

Graph的C结构,有助于理解结构

C# 向组合框添加长字符串

c# - Distinct 不使用 LINQ to Objects

c# - 使用数据注释的有条件要求的属性

wpf - WPF按钮内的png图像

python - 最短路径搜索 - 使用边类型 [NetworkX、igraph]