WPF画布性能 - children.add多次调用

时间:2011-01-31 00:07:18

标签: c# .net wpf canvas

我在很长的画布上绘制很多线条(想想条形图),并且使用低级几何类并冻结它们等性能调整得相当好。这显着改善了性能,但仍需要几秒钟就可以将几千件物品装入画布。我对应用程序进行了性能分析,看起来每次调用canvas.children.add()时占很大比例。我已经读过这应该是一个轻量级的调用,因为我在一个方法中多次调用它,它不应该试图在中间做任何重的事情......可能有任何其他原因这可能会采取如此多的时间?我可以用任何方式加快速度吗?

性能并不可怕,但我担心以后当我需要处理更大的数据集时,这可能会成为一个问题。

仅供参考,在此示例中看起来它被称为1400次,并且它在现代/快速笔记本电脑上花费了近3秒的CPU时间。

画布虽然包含在其他控件的层次中,所以我很好奇他们是否可能对此做出贡献。

额外注意:我也没有在画布上设置特定高度,因为它被设置为填充网格父容器。这可能是问题的根源吗?

3 个答案:

答案 0 :(得分:5)

主要问题是,即使您使用StreamGeometry对象,Children.Add也始终是一个缓慢的操作。我最近遇到了同样的问题并得出以下结论: 如果将一堆对象放入新画布并将其嵌入主画布中,则添加操作的性能将显着提高。 因此,不是添加1400个元素,而是在7个画布中放置200个元素,并将这7个画布添加到主画布中。 由于现在所有对象都属于不同的画布,因此您需要稍微调整一下您的应用程序,但这比转向另类解决方案(如DrawingVisual)

更难以解决问题。

答案 1 :(得分:1)

只是添加画布所在的控件层次结构,以及画布的高度:

Canvas总是占用与其给定的空间一样多的空间,无论你添加什么孩子,它都不会触发新的Measuer / Arrange传递给它的父母。因此,无论你在画布中做什么都不会影响它所包含的可视树。 总结一下 - 问题不可能来自那里,关于StreamGeomatry的建议是完全正确的 - 这就是导致性能问题的原因,并且切换到streamgeormatry会解决它。

答案 2 :(得分:0)

我建议您将形状直接绘制到图像中,而不是将它们作为子项添加。 渲染孩子有很大的开销(如你所见)。

有一个类似的问题,参考了一些有用的文章:

How to draw line of ten thousands of points with WPF within 0.5 second?

相关问题