如何提高WPF UI渲染速度

时间:2011-03-23 06:22:06

标签: wpf performance user-interface rendering

如果WPF应用程序的屏幕包含许多原始控件,则其呈现会变得迟缓。在这种情况下,除了添加更少的控件和使用更强大的视频卡之外,有哪些建议的方法可以提高WPF应用程序的响应能力?

有没有办法以某种方式使用屏幕外缓冲或类似的东西?

3 个答案:

答案 0 :(得分:50)

我们的团队遇到了渲染性能问题。在我们的例子中,我们有大约400个运输单元,我们应该渲染每个单元的图表,其中包含许多细节(文本标签,特殊标记,不同的几何形状等)。

在我们的实现中,我们将每个图表拆分为基元,并通过Binding组成整个单元的图表。这是非常伤心的事。 UI反应非常缓慢。

因此我们决定为每个单元创建一个 UI元素,并使用DrawingContext渲染图表。虽然这在性能方面要好得多,但我们花了大约一个月的时间来改进渲染。

一些建议:

  1. 缓存一切。画笔,颜色,几何图形,格式化文本,字形。 (例如,我们有两个类:RenderToolsTextCache。每个单元的渲染过程都会解析为两个类的共享实例。因此,如果两个图表具有相同的文本,则其准备只执行一次。)
  2. 冻结Freezable,如果您计划长时间使用它。特别是几何形状。复杂的解冻几何执行HitTest极其缓慢。
  3. 选择每种基元的最快渲染方式。例如,大约有6种文本呈现方式,但最快的是DrawingContext.DrawGlyphs
  4. 使用分析器发现热点。例如,在我们的项目中,我们有几何缓存并根据需要呈现它们。似乎是,没有任何改进是可能的。但有一天,我们想到如果我们将一次渲染几何图形并缓存准备好的视觉效果怎么办?在我们的案例中,这种方法可以接受我们单位的图表只有几个州。当图表数据发生变化时,我们为每个状态重建DrawingVisual并将它们放入缓存中。
  5. 当然,这种方式需要一些投资,这是枯燥乏味的工作,但结果很棒。

    顺便说一句:当我们打开WPF缓存选项(你可以在答案中找到链接)时,我们的应用程序挂断了。

答案 1 :(得分:7)

自从一年以来,我在定制数据网格方面遇到了同样的问题,我的结论是:

  

基本上没什么可以做的   在你身边(不影响你   应用程序,即:控制较少或   仅使用默认样式)

Jens提到的链接很棒但在你的情况下毫无用处。

NVM提供的“优化WPF应用程序性能”链接在我的经验中几乎同样无用:它只是吸引常识,我相信你不会学习任何非凡的阅读。 除了一件事:我必须说这个链接教会我尽可能多地放入我的应用资源中。因为WPF不会重新放入您放入资源的任何内容,所以它只是一遍又一遍地重用相同的资源。所以尽量放在那里(样式,画笔,模板,字体......)

总而言之,只是通过检查选项或关闭其他选项,根本无法让WPF中的内容更快。您可以祈祷MS在不久的将来重新设计渲染层以优化它,同时尝试减少对效果,自定义控件等的需求......

答案 2 :(得分:3)

查看新的(.NET 4.0)缓存选项。 (见here。)