如果 WPF 应用程序的 XAML 包含大量嵌套Grid
的StackPanel
、DockPanel
和其他容器,渲染性能是否会严重下降?
3 回答
真正的答案是“是”。更多的东西将使用更多的处理器时间。惊喜!
在 WPF 的情况下,元素被排列成一个分层的场景图。与向现有元素添加同级元素相比,向该图添加深度级别会降低您的应用程序的速度。您应该始终努力保持图表的深度较低。考虑使用Grid
而不是嵌套StackPanel
s。
那么为什么深度比原始元素计数更重要呢?好吧,深度通常意味着;
- 布局依赖 - 如果调整父级的大小,则可能会重新渲染子级。
- 遮挡 - 如果 2 个元素重叠,使一个元素失效通常会使另一个元素失效。
- 递归 - 大多数图形操作都受 CPU 限制- 它们完全取决于 CPU 速度并且没有专用的硬件支持(渲染器尽可能使用您的图形芯片)。循环遍历图表的各个级别以获取资源和布局更新是昂贵的。
关于遮挡,该BitmapCache
课程可以提供很大帮助!
当你创建一个非常复杂的 UI,包含大量嵌套对象和包含大量元素的 DataTemplate 时,你会严重影响 App 的性能,因为 UI Tree 越大,渲染所需的时间就越大,如果框架不能以 30FPS 渲染,您将开始看到性能下降。您应该使用您需要的最轻量级的面板,以避免不必要的额外逻辑。以下是一些性能提示,以使您的应用程序更快:
http://msdn.microsoft.com/en-us/library/bb613542(v=vs.110).aspx
WPF 使用MeasureOverride
和ArrangeOverride
方法来呈现 UIElements。MeasureOverride
根据父控件的宽度和大小测量 UIElements 的宽度和大小。ArrangeOVerride
方法将根据这些措施在运行时安排 UIElements。这些方法针对更快的性能进行了优化,不会导致任何渲染性能问题。
但是应该有一个容量,这些方法可以在最短的时间内处理 UIElements。如果超过此限制,则应该存在性能问题。
例如:假设一辆自行车可以载 2 个人。如果 5 人超载会发生什么:)
Jet Brains .Trace 是一种分析性能问题的工具,有助于了解这两种方法