WPFcanvas性能 – children.add多次调用

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

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

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

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

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

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

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

Canvas总是占用尽可能多的空间,无论你添加什么孩子 – 它永远不会触发一个新的Measuer / Arrange传递给它的父母。 因此,无论你在canvas内做什么都不会影响它所包含的视觉树。总结一下 – 问题不能来自那里,关于StreamGeomatry的建议是完全正确的 – 这就是造成性能问题的原因,以及切换到streamgeormatry会解决它。

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

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

如何在0.5秒内用WPF画出数万个点?