1

我目前从事与 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 脏矩形更新算法,开发人员可以犯哪些典型错误。任何输入都受到高度赞赏。

致以真诚的感谢和诚挚的问候!

曼努埃尔

4

1 回答 1

3

感谢您的输入。让我澄清一下后端驱动:UI 是高度动态的。来自后端的消息定义了 ui 的结构和要显示的数据。因此,我们没有任何用于选项卡结构的 xaml,只有 c#。

与此同时,我可以解决这个问题。我使用 Snoop 并在监控 GPU 使用情况时一个一个地折叠每个元素。我发现其中一个边框上有一个非常小的像素着色器效果(DropShadowEffect)。我一移除效果,GPU 就从 80% 下降到 1%。WPF 在 UI 的一小部分上绘制了正确的脏矩形。问题解决,案件结案。

我觉得有趣的事情: 1. 这个小影响对 GPU 使用的巨大影响。2. 它打破了dirty-rect计算。3. 由于它不是 BitmapEffect 而是 PixelshaderEffect 我无法通过禁用 Perforator 中的 BitmapEffects 来显示它。

谢谢!毫米

于 2013-09-17T20:16:45.137 回答