WPF表现。错误的脏计算

时间:2013-09-16 20:17:29

标签: wpf c#-4.0 wpf-4.0 dirtyrectangle

我目前从事与WPF富客户端LOB应用程序中的性能问题相关的客户分配。

问题是应用程序运行速度很慢/缓慢。特别是数据表处理(滚动,排序,选择)非常慢,使应用程序无法使用。

我分析了包含少量文本框,组合框和标签的单个选项卡并保持空闲状态(等待用户输入)时的系统状态。

这些是我的发现:

  • 所有渲染都是在GPU上计算的
  • 没有性能繁重的功能,如动画,位图效果,透明度等。
  • 当标签空闲时(只有光标在聚焦文本框中闪烁,标签的其余部分是静态的,甚至不包含任何数据)GPU运行高达90%
  • 只要标签失去焦点,GPU就会降至0
  • GPU百分比与窗口大小直接相关。一个小窗口将其降低到几个百分点,全屏使其几乎达到100%
  • WPF Perforator告诉我WPF计算整个标签的脏区域,而不是只计算闪烁的光标
  • WPF Perforator在空闲选项卡上报告大于20 /秒的脏直接更新率,它们与GPU使用率直接相关

我的结论: 在开发过程中,引入了许多自定义代码(布局,事件处理等),以便将WPF整合到系统的后端驱动架构中。我的猜测是,由于一些自定义代码,WPF的脏矩形机制已被破坏。这导致过多的绘图活动,因此GPU使用率非常高。这些不必要的活动导致了上述问题。

现在我正在寻找任何我应该开始调查的建议。或者换句话说:开发人员可以为破坏WPF脏矩更新算法而犯的典型错误是什么。任何意见都非常感谢。

非常感谢和最诚挚的问候!

曼努埃尔

1 个答案:

答案 0 :(得分:0)

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

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

对我来说似乎很有趣的事情: 1.这种小影响对GPU使用的巨大影响。 它打破了脏计算。 3.由于它不是BitmapEffect而是PixelshaderEffect,我无法通过在Perforator中禁用BitmapEffects来揭示它。

谢谢! MM