Mik*_*scu 10 wpf graphics charts data-visualization real-time
我一直在试图弄清楚在WPF中将实时数据渲染为线图的合适方法.实际上,我实际上是指从USB设备收集的数据,该设备以大约40Hz的速率生成数据.有多个(最多7个)数据流,我以40Hz的频率以异步方式读取.
我尝试过使用两种现成的解决方案(WPF Toolkit图表和Swordfish图表),几乎查看了动态数据可视化组件,但在阅读了论坛上的一些评论之后放弃了它.似乎现成的图表解决方案面向静态图表,我实际上需要类似于Windows任务管理器的东西 - 只是更快,并且有更多的数据点.
目前,我已经推出了我自己的解决方案,这似乎是迄今为止最好的解决方案,但我有一种感觉,我错过了一些东西,因为它似乎应该能够从中获得更好的性能.
要求是它应该能够在滑动窗口中处理大约10000点的恒定范围 - 当新数据进入时(40Hz),旧数据被推到可见范围之外的左侧.并且它需要维持这个速率至少20-30分钟(每个数据流总共约75-10万个点).
我当前的自定义实现基于一个继承自Shape的组件,并使用StreamingGeometry作为DefinigGeometry.来自设备的数据通过队列传递给组件,以提高性能,因为固有的"突发效应",并且在出队操作之后,组件无效.
所以,我的问题是,我是在正确的道路上还是我完全错了?在WPF中实现此类数据可视化的最有效方法是什么?任何帮助或提示将不胜感激.
如前所述,WPF“标准”方式执行此操作不会获得所需的性能。在尝试了几种不同的免费和商业产品但没有得到我需要的东西后,我开始尝试以下方法:
两人的演技根本就没有。
我知道的一件事是 WPF 擅长渲染图像(BitmapSource),所以我决定朝这个方向发展,使用 WriteableBitmapEx 在 WriteableBitmap 上绘制图形,然后将其传递...
WriteableBitmapEx 库的一个问题是它没有太多绘图功能,例如 GDI。那么为什么不直接使用GDI呢?如果你做对了,没有什么区别。
例子:
public void BeginDraw()
{
_writeable_bitmap = new WriteableBitmap((int)Math.Max(_size.Width, 1),
(int)Math.Max(_size.Height, 1), 96.0, 96.0, PixelFormats.Pbgra32, null);
_gdi_bitmap = new System.Drawing.Bitmap(_writeable_bitmap.PixelWidth,
_writeable_bitmap.PixelHeight,_writeable_bitmap.BackBufferStride,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb,
_writeable_bitmap.BackBuffer);
_writeable_bitmap.Lock();
_g = System.Drawing.Graphics.FromImage(_gdi_bitmap);
_g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
_g.Clear(System.Drawing.Color.Transparent);
}
public void DrawSeries(IEnumerable<System.Drawing.PointF> points)
{
_g.DrawCurve(dataSeries.GdiPen, points.ToArray());
}
public void EndDraw()
{
_writeable_bitmap.AddDirtyRect(new Int32Rect(0, 0,
_writeable_bitmap.PixelWidth, _writeable_bitmap.PixelHeight));
_writeable_bitmap.Unlock();
var cloned = _writeable_bitmap.Clone();
cloned.Freeze();
Dispatcher.BeginInvoke(new Action((() =>
{
Image = cloned;
})));
_g.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用“特殊技巧”使用 GDI 将图形直接绘制到本机 WPF BitmapSource。
我不确定这是正确的测量方法,但使用这种方法我已经取得了一些非常不错的结果:
我是开源库 RealTimeGraphX(适用于 WPF 和 UWP)的作者,它正是这样做的。 https://github.com/royben/RealTimeGraphX
除了实际的线系列之外,其余的图形组件都是使用标准 WPF 控件和形状制作的,因此可以轻松地自定义和操作它们。
WPF 的保留模式呈现使得绘制/重绘自定义图表和图像难以提高性能,尤其是当这些绘图包含大量对象时。
我在 WPF 中能够完成的最快绘图是使用 WritableBitmap 并通过调用 WritePixels 来填充它,这可能是您的一个选择。它远远超过了我使用 PathGeometries 编写的图表并绘制到画布上的绘制速度。
我有兴趣看看是否有更快的中间立场。
| 归档时间: |
|
| 查看次数: |
4682 次 |
| 最近记录: |