在WPF中呈现图表的最佳方法是什么?

时间:2010-08-09 08:29:58

标签: wpf rendering

渲染图表然后将它们保存在硬盘上以便使用WPF进一步分发的最佳方法是什么? 我通过使用以下类型找到了许多方法来实现这一目标:

  1. DrawingVisual - 创建此类型的对象,然后在其上下文中呈现图形;
  2. Shape - 从Shape类派生,然后覆盖其实际渲染发生的 DefiningGeometry 属性;
  3. PathFigure - 将 LineSegment -s添加到此类的实例,然后将此实例添加到Canvas;
  4. Adorner - 从中​​衍生,然后覆盖其 OnRender 方法;
  5. WritableBitmap - 在其上呈现,然后将位图添加到Canvas。
  6. 当然,我要编写一个应用程序来测试每个应用程序的速度。但有人可以告诉我:

    • 我是否走在正确的轨道上?
    • 还有其他方法可以进行此类渲染吗?
    • 其中一个是最好的 绩效条款?

1 个答案:

答案 0 :(得分:1)

这一切都取决于你的实际使用情况,在你的情况下你提到在硬盘上保存“进一步分发” - 我会假设你将它们保存为图像(jpg或png)而不是wpf对象(XAML)。

  1. 你应该考虑WPF是否适合这项工作,WPF是一个UI框架,而不是一个通用的图像处理库,最好完全使用其他东西来生成图像。

    < / LI>
  2. 对于合理数量的点,您的性能瓶颈将是对图像进行编码并将其保存到磁盘 - 而不是实际渲染它 - 因此您应该选择更容易编码的方法。

    < / LI>
  3. 关于高性能WPF图表的所有文章都是:关于10,000点以上的图表(因为这是性能问题所在的地方),b:关于你在GUI中显示的图表(因为否则你可以使用一个用于创建位图的图像处理库)和c:一直在变化的图表(因此它们可以很好地与数据绑定工作) - 这就是为什么他们不讨论将图表保存到磁盘的原因。

  4. 对于非常多的要点:

    • 在WPF中绘制的最快方法是从FrameworkElement(不是Adorner)继承并覆盖OnRender。
    • 当数据经常更改时,建议使用多个DrawingVisual对象,因为当一个值更改时,您不必重新渲染所有内容 - 但这与您无关,因为保存后图像不会更改无论如何。
    • WritableBitmap用于原始位图访问,当你决定放弃所有漂亮的布局和绘图WPF给你时你使用它,因为你不能承担开销,如果是这种情况你应该重新读取我的第一点。
  5. 因此,总而言之,您提出了错误的问题:-)如果您需要将图像保存到磁盘,而不是WPF渲染速度不是您的瓶颈,或者您不应该使用WPF开始。如果您使用WPF,只需选择最容易编码的内容。

    BTW:Adorners用于在普通用户界面上方显示“浮动”元素,您可以将它们用于类似工具提示的功能,但不能用于主图表渲染(并且您可能根本不需要它们,因为您的主要用途将图像保存到磁盘),FrameworkElement是您要查找的基类。