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

我在很长的画布上绘制了许多线条(想想条带图)并且使用低级几何类并冻结它们等性能调整得相当好。这显着改善了性能,但仍需要几秒钟将几千个项目加载到画布中。我对应用程序进行了性能分析,每次调用
canvas.children.add()
时,看起来很大一部分时间。我已经读过这应该是一个轻量级的调用,因为我在一个方法中多次调用它,它不应该试图在中间做任何重的事情......可能有任何其他原因这可能会采取如此多的时间?我可以用任何方式加快速度吗? 性能并不可怕,但我担心以后当我需要处理更大的数据集时,这可能会成为一个问题。 仅供参考,在此示例中看起来它被称为1400次,并且它在现代/快速笔记本电脑上花费了近3秒的CPU时间。 画布虽然包含在其他控件的层次中,所以我很好奇他们是否可能对此做出贡献。 额外注意:我也没有在画布上设置特定高度,因为它被设置为填充网格父容器。这可能是问题的根源吗?     
已邀请:
主要问题是,即使您使用StreamGeometry对象,Children.Add也始终是一个缓慢的操作。我最近遇到了同样的问题并得出以下结论: 如果将一堆对象放入新画布并将其嵌入主画布中,则添加操作的性能将显着提高。 因此,不是添加1400个元素,而是在7个画布中放置200个元素,并将这7个画布添加到主画布中。 由于现在所有对象都属于不同的画布,因此您需要稍微调整一下您的应用程序,但这比使用DrawingVisual等替代解决方案更难以解决问题。     
只是添加画布所在的控件层次结构,以及画布的高度: Canvas总是占用尽可能多的空间,无论你添加什么孩子,它都不会触发新的Measuer / Arrange传递给它的父母。因此,无论你在画布中做什么都不会影响它所包含的可视树。 总结一下 - 这个问题不可能来自那里,关于StreamGeomatry的建议是完全正确的 - 这就是导致性能问题的原因,切换到流式处理会解决它。     
我建议您将形状直接绘制到图像中,而不是将它们作为子项添加。 渲染孩子的开销很大(正如你所看到的)。 有一些类似的问题,参考了一些有用的文章: 如何在0.5秒内用WPF画出数万个点?     

要回复问题请先登录注册