我目前从事与 WPF 富客户端 LOB 应用程序中的性能问题相关的客户分配工作。
问题是应用程序运行非常缓慢/缓慢。尤其是数据表处理(滚动、排序、选择)非常慢并且使应用程序无法使用。
当包含几个文本框、组合框和标签的单个选项卡打开并处于空闲状态(等待用户输入)时,我分析了系统状态。
这些是我的发现:
- 所有的渲染都是在 GPU 上计算的
- 没有动画、位图效果、透明度等性能重的功能。
- 当标签闲置时(只有光标在聚焦文本框中闪烁,选项卡的其余部分是静态的,甚至不包含任何数据)GPU运行高达90%
- GPU drops to 0 whenever the tab loses focus
- GPU百分比与窗口大小直接相关。一个小窗口将其降低到百分之几,全屏使其几乎达到 100%
- WPF Perforator 告诉我 WPF 计算整个选项卡的脏区域,而不是只计算闪烁的光标
- WPF Perforator 在空闲选项卡上报告大于 20/秒的脏矩形更新率,它们与 GPU 使用率直接相关
我的结论:在开发过程中,为了使 WPF 适合整个系统的后端驱动架构,引入了许多自定义代码(布局、事件处理等)。我的猜测是,由于某些自定义代码,WPF 的脏矩形机制已被破坏。这会导致过多的绘图活动,从而导致非常高的 GPU 使用率。这些不必要的活动导致上述问题。
现在我正在寻找我应该从哪里开始调查的任何建议。或者换句话说:为了破坏 WPF 脏矩形更新算法,开发人员可以犯哪些典型错误。任何输入都受到高度赞赏。
致以真诚的感谢和诚挚的问候!
曼努埃尔