【问题标题】:Why is there a black lag every time a WPF window is resized?为什么每次调整 WPF 窗口大小时都会出现黑色滞后?
【发布时间】:2014-05-25 17:27:22
【问题描述】:

关于 SE 的其他问题涉及如何加快嵌套 UI 控件的大小调整,但是 - 如果没有任何控件怎么办?

当您拖动 WPF 窗口的边缘时,即使是没有内容的主窗口,在拖动过程中黑条也会短暂闪烁。这会产生一种糟糕的感觉——我不想给客户造成这种感觉:

加上完整的用户界面,它确实会变得更慢更重。当使用顶部或左侧边缘调整大小时,这甚至不会影响它的外观。 Windows 窗体——即使是我构建的最繁重的用户界面——也从来没有看起来这么糟糕。

如何使 WPF 窗口大小调整性能与 win 表单相当?

(我在 AT Radeon HD 7470 上有 Windows 7 x64 和三显示器系统。)

【问题讨论】:

  • 我不相信(但我不确定)我们可以实施真正的解决方案。只需打开 Microsoft Word/Excel/Outlook 并调整应用程序的大小,您就会遇到与您遇到的几乎相同的问题。有一些方法可以帮助降低知名度 (found here),但如果 Microsoft 无法通过自己的软件解决该问题,那么我认为我们也无法做到。
  • Word、Excel 和 Outlook 在我的系统上调整大小非常好,完全没有黑色。然而,Visual Studio 和 Blend 却没有。工具窗口可以。
  • 不知道是什么原因造成的?
  • 有趣的问题我在XP和Win7上肯定没有。我们主要运行 7 系列 AMD 卡。您是否尝试过强制软件渲染以查看会发生什么?在应用程序启动中尝试 RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly.
  • 您是否尝试过更新您的 GPU 驱动程序?

标签: wpf


【解决方案1】:

您可以更新您的显卡并再次尝试,但这不会改变任何事情。原因很简单。我们有时会根据我们的计算机的速度/速度来看到这一点。有时它运行流畅,因为我们没有很多视觉效果要绘制。原因是在重绘过程​​中此时显卡中没有找到合适的背景颜色。您的驱动程序很好,这不仅仅是因为您使用 Wpf。其他技术在重绘背后使用相同的机制。

WPF 要做的第一件事是清除要重绘的脏区。脏区的目的是减少发送到 GPU 管道输出合并阶段的像素数量。这是我们看到黑色的地方。此时窗口本身没有背景颜色,或者它的背景颜色设置为透明,因此对我们而言,GPU 绘制黑色背景。事情在 wpf 中异步运行,这很好。

要解决此问题,您可以为窗口设置修复颜色,例如“白色”。然后 WPF 系统将清除脏区域,但会自动用白色而不是黑色填充它。这通常会有所帮助。

匹配窗口颜色或最顶层的颜色。不要让GPU使用黑色,你应该做得很好。顺便说一句,Wpf 比 WinForm 快,所以不用担心。

【讨论】:

    【解决方案2】:

    外观确实很糟糕,尤其是在使用顶部或左侧边框时。

    您的屏幕截图显示的确切问题取决于您的应用渲染所需的时间以及您可以调整的一些与背景相关的设置以更好地调整大小。另外,丑陋的调整大小的一部分是特定于 Aero 的。

    虽然我无法解决 WPF 重绘的具体疯狂缓慢问题,但我至少可以就您看到黑色的原因、黑色的来源以及是否可以更改为不那么烦人的填充颜色提供一些见解。

    事实证明,有多种不同的黑色来源和来自不同 Windows 版本的不良调整大小行为结合在一起。请参阅此问答,它解释了正在发生的事情并提供了如何做的建议(同样,不是特定于使 WPF 更快,而只是看看你可以根据你的速度做些什么):

    How to smooth ugly jitter/flicker/jumping when resizing windows, especially dragging left/top border (Win 7-10; bg, bitblt and DWM)?

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多