改善WPF Canvas性能

时间:2011-09-26 20:25:54

标签: wpf performance wpf-controls maps scaletransform

我正在使用WPF开发类似地图的应用程序。我有~10,000个PathGeometry,Shapes添加到画布上。我已经添加了ScaleTransform和TranslateTransform来进行缩放和平移控制。

我面临的问题是,当我缩放或平移时,会有轻微的延迟。有没有办法组织数据,以便我只处理可见的形状?

任何提高效率的提示都会有所帮助和赞赏。

3 个答案:

答案 0 :(得分:7)

我建议您看看这篇有趣的文章,其中包含Virtual Canvas的概念:ZoomableApplication2: A Million Items。它还有一个在线直播(xbap)演示。

答案 1 :(得分:6)

你在画布上放什么样的东西?如果使用pathGeometry,是否将它们封装在Path类中?如果是这样,Path在其超类层次结构中具有FrameworkElement,这会导致大量性能损失。

Take a look at my question here.虽然它是关于Shape类的,但性能下降的原因是相同的,FrameworkElement。

如果您这样做,解决方法是使用PathGeometry,并使用DrawingContext.DrawGeometry()方法将其封装在DrawingVisual的DrawingContext中。

以下是一些应该有用的链接。 Path Geometry

DrawingContext.DrawGeometry()

Optimizing Performance: 2D Graphics and Imaging

自己绘制形状,使用线条组合,以及从Geometry类(ArcGeometry,PathGeometry等)派生的类提供的其他东西。

这应该有所帮助。

答案 2 :(得分:2)

如果您希望在WPF中立即获得最佳性能,请查看WriteableBitmapEx。这是一个优秀的开源库,我最近做出了贡献。它在WriteableBitmap上提供类似GDI的绘图功能,并与Windows Phone,WPF和Silverlight兼容。 API很简单,你可以得到blitting,多边形,线条和简单的形状......但是你不会得到datatemplates和渐变画笔。