【问题标题】:WPF Performance. Wrong dirty rect calculationWPF 性能。错误的脏矩形计算
【发布时间】: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


【解决方案1】:

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

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

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

谢谢! 嗯

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 2021-06-03
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多