【发布时间】:2013-09-21 02:33:28
【问题描述】:
我目前从事与 WPF 富客户端 LOB 应用程序中的性能问题相关的客户任务。
问题是应用程序运行非常缓慢/缓慢。尤其是数据表处理(滚动、排序、选择)非常慢,导致应用程序无法使用。
当包含几个文本框、组合框和标签的单个选项卡打开并处于空闲状态(等待用户输入)时,我分析了系统状态。
这些是我的发现:
- 所有的渲染都是在 GPU 上计算的
- 没有动画、位图效果、透明度等性能要求高的功能。
- 当标签为空闲时(仅在聚焦文本框中只闪烁光标时,标签的其余部分是静态的,并且甚至没有包含任何数据)GPU最多90% Li>
- 只要标签页失去焦点,GPU 就会降为 0
- GPU 百分比与窗口大小直接相关。一个小窗口将其降低到百分之几,全屏使其几乎达到 100%
- WPF Perforator 告诉我 WPF 会计算整个选项卡的脏区,而不是只计算闪烁的光标
- WPF Perforator 在空闲选项卡上报告大于 20/秒的脏矩形更新率,它们与 GPU 使用率直接相关
我的结论: 在开发过程中,引入了许多自定义代码(布局、事件处理等),以使 WPF 适合整个系统的后端驱动架构。我的猜测是,由于某些自定义代码,WPF 的脏矩形机制已被破坏。这会导致过多的绘图活动,从而导致非常高的 GPU 使用率。这些不必要的活动导致了上述问题。
现在我正在寻找我应该从哪里开始调查的任何建议。或者换句话说:为了破坏 WPF 脏矩形更新算法,开发人员可以犯哪些典型错误。任何意见都非常感谢。
非常感谢和最好的问候!
曼努埃尔
【问题讨论】:
-
我不认为这与渲染等有关。确保您的所有 ItemsControls 都是虚拟化的。发布应用程序有问题部分的一些相关代码和 XAML。
-
顺便说一句,我不知道您所说的“后端驱动”是什么意思。 WPF 布局在 XAML 中完成。如果他们在过程代码中对 UI 元素进行了可怕的类似 winforms 的操作(这是大多数人所做的),那么将会产生意想不到的负面结果。 WPF 不支持具有 winforms 心态的开发人员。
标签: wpf c#-4.0 wpf-4.0 dirtyrectangle