提高WPF UI渲染速度的方法

如果WPF应用程序的屏幕包含很多原始控件,则其渲染变得缓慢。 在这种情况下,除了增加更less的控件和使用更强大的video卡之外,还有哪些build议的方法可以提高WPF应用程序的响应速度?

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

我们的团队面临着渲染性能的问题。 在我们的情况下,我们有大约400个运输单位,我们应该给每个单位提供很多细节(文本标签,特殊标记,不同几何形状等)的图表。

在我们的实现中,我们将每个图表分解为图元,并通过绑定组合整个单元的图表。 这是非常难过的经历。 UI反应非常缓慢。

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

一些build议:

  1. caching一切。 画笔,颜色,几何,格式化文本,字形。 (例如,我们有两个类: RenderToolsTextCache ,每个单元的渲染过程地址都是两个类的共享实例,所以如果两个图表具有相同的文本, TextCache准备执行一次。
  2. 冻结Freezable ,如果你打算长期使用它。 特别是几何形状。 复杂的解冻几何执行HitTest非常缓慢。
  3. select最快的方式来渲染每个基元。 例如,大约有6种文本渲染方式,但最快的是DrawingContext.DrawGlyphs
  4. 使用分析器来发现热点。 例如,在我们的项目中,我们有几何caching,并根据需要进行适当的渲染。 似乎没有改进是可能的。 但有一天,我们想如果我们一次渲染几何graphics并caching准备好的图像? 在我们这种情况下,这种做法可以接受 我们单位的图表只有几个州。 当图表的数据发生变化时,我们为每个状态重buildDrawingVisual并将其放入caching。

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

顺便说一句:当我们打开WPFcaching选项(你可以find答案的链接),我们的应用程序挂起。

自从一年以来,我已经有了一个与高度定制的数据网格相同的性能问题,我的结论是:

基本上没有什么可以在你身边做的(不影响你的应用程序,即:拥有更less的控件或只使用默认样式)

Jens提到的链接很棒,但是对你来说没用。

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

总而言之,仅仅通过检查一个选项或closures另一个选项,根本就没有办法让WPF中的事情变得更快。 你可以在不久的将来向MS重新渲染他们的渲染层来优化它,同时,尽量减less你对效果,自定义控件等的需求。

看看新的(.NET 4.0)caching选项。 (见这里 )