2009-08-28 56 views
3

当前,我正在使用System.Windows.Media.DrawingGroup在Children-DrawingCollection属性中存储一些平铺图像(ImageDrawing)。 现在的问题是,如果您在Image控件中显示整个DrawingGroup,则此方法会变得非常慢,因为我的DrawingGroup可能包含数百甚至数千的小图像,它可能会影响性能。将WPF DrawingGroup渲染为单个ImageSource

所以我的第一个想法是以某种方式渲染DrawingGroup中所有小图像的单个图像,然后只显示该图像,这会更快。但正如你可能已经想通了,我还没有找到任何解决方案,所以简单地将几个图像与WPF成像。

如果有人能够帮助解决这个问题,或者告诉我如何使用DrawingGroup提高性能,甚至使用其他方法,那真的很棒。最后还有一件事,目前我使用RenderTargetBitmap来从DrawingGroup生成一个BitmapSource,这种方法并不是很快,但它使滚动和在Image控件上的工作至少更平滑一些。

回答

1

我正在处理与平铺图像有关的问题,增加了复杂性,不得不显示覆盖在其他图像上的一些图像。

我还没有遇到任何性能问题(并且可能不会出现,因为我的图像相对较小且数量相对较少,最大大约为100),但我在代码示例中遇到了Freeze方法DrawingImage类。对此的评论是“冻结DrawingImage以获得性能优势”。

Freeze方法也适用于DrawingGroup类。也许试试看吧?

2

我不知道这适用于您的问题,但我会在这里发布也无妨,因为它可能会帮助别人:

如果不是所有的绘图组中的图像的将是在可见同时,您可以将ClipGeometry属性设置为您希望绘制的任何内容。这有效地告诉WPF几何外部的部分不需要,并且在渲染过程中将被跳过。

,你可以尝试使用一些其他的东西是:

  • Freeze的drawinggroup把它应用到你的图像源之前。至少它不会伤害(除非你真的需要修改实例,但要记住,你总是可以创建一个新的而不是修改旧的)
  • 尝试不同的方法来显示你的绘图组。例如,作为DrawingVisual(其被认为是轻重量)或作为DrawingBrush来绘制例如一个矩形。
  • 将小图像组合成更小的组,然后将其组合成更大的组。不知道这是否会改善或损害性能,但可能值得尝试。