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

Bra*_*itz 7 .net c# wpf canvas

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

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

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

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

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

小智 5

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


Nig*_*ler 0

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

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

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

  • 根据性能对您的重要性,您可能需要考虑使用 C# 中的众多游戏框架之一(即操纵精灵的框架)中的解决方案。当然 - 如果您还想使用其他 UI 框架机制,但这些机制对您没有真正的帮助...顺便说一句:在某些情况下,WPF 将不使用硬件渲染,这会显着降低性能 - 您可以使用此方法“调试”进行检查.WriteLine("WPF RenderCapability: 渲染层 = " + (RenderCapability.Tier >> 16) + " (所需 2, 0 表示无硬件加速)");' (3认同)