如何提高WPF UI渲染速度

rem*_*rem 41 wpf performance user-interface rendering

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

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

Ale*_*hik 50

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

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

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

一些建议:

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

当然,这种方式需要一些投资,这是枯燥乏味的工作,但结果很棒.

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

  • [Here](http://pastebin.com/v83XZLTc)我上传了RenderTools对象的简化版本.[这里](http://pastebin.com/e8VhuHez)是用例.如果您还有问题,请随时提出. (4认同)

Dav*_*vid 7

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

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

Jens提到的链接很棒但在你的情况下没用.

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

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