如果WPF应用程序的屏幕包含许多原始控件,则其呈现会变得迟缓。在这种情况下,除了添加更少的控件和使用更强大的视频卡之外,有哪些建议的方法可以提高WPF应用程序的响应能力?
有没有办法以某种方式使用屏幕外缓冲或类似的东西?
答案 0 :(得分:50)
我们的团队遇到了渲染性能问题。在我们的例子中,我们有大约400个运输单元,我们应该渲染每个单元的图表,其中包含许多细节(文本标签,特殊标记,不同的几何形状等)。
在我们的实现中,我们将每个图表拆分为基元,并通过Binding组成整个单元的图表。这是非常伤心的事。 UI反应非常缓慢。
因此我们决定为每个单元创建一个 UI元素,并使用DrawingContext渲染图表。虽然这在性能方面要好得多,但我们花了大约一个月的时间来改进渲染。
一些建议:
RenderTools
和TextCache
。每个单元的渲染过程都会解析为两个类的共享实例。因此,如果两个图表具有相同的文本,则其准备只执行一次。) Freezable
,如果您计划长时间使用它。特别是几何形状。复杂的解冻几何执行HitTest极其缓慢。 DrawingContext.DrawGlyphs
。 当然,这种方式需要一些投资,这是枯燥乏味的工作,但结果很棒。
顺便说一句:当我们打开WPF缓存选项(你可以在答案中找到链接)时,我们的应用程序挂断了。
答案 1 :(得分:7)
自从一年以来,我在定制数据网格方面遇到了同样的问题,我的结论是:
基本上没什么可以做的 在你身边(不影响你 应用程序,即:控制较少或 仅使用默认样式)
Jens提到的链接很棒但在你的情况下毫无用处。
NVM提供的“优化WPF应用程序性能”链接在我的经验中几乎同样无用:它只是吸引常识,我相信你不会学习任何非凡的阅读。 除了一件事:我必须说这个链接教会我尽可能多地放入我的应用资源中。因为WPF不会重新放入您放入资源的任何内容,所以它只是一遍又一遍地重用相同的资源。所以尽量放在那里(样式,画笔,模板,字体......)
总而言之,只是通过检查选项或关闭其他选项,根本无法让WPF中的内容更快。您可以祈祷MS在不久的将来重新设计渲染层以优化它,同时尝试减少对效果,自定义控件等的需求......
答案 2 :(得分:3)
查看新的(.NET 4.0)缓存选项。 (见here。)