Window 的合成引擎 (DWM) 中的背景色工件

Background Color Artifact in Window's Composition Engine (DWM)

来自 Kenny Kerr's blog 的上下文:

Windows Vista introduced a service called the Desktop Window Manager. The name was and continues to be misleading. Think of it as the Windows composition engine or compositor. This composition engine completely changed the way application windows are rendered on the desktop. Rather than allowing each window to render directly to the display, or display adapter, every window renders to an off-screen surface or buffer. The system allocates one such surface per top-level window and all GDI, Direct3D and, of course, Direct2D graphics are rendered to these surfaces. These off-screen surfaces are called redirection surfaces because GDI drawing commands and even Direct3D swap chain presentation requests are redirected or copied (within the GPU) to the redirection surface.

At some point, independent of any given window, the composition engine decides it’s time to compose the desktop given the latest batch of changes. This involves composing all of these redirection surfaces together, adding the non-client areas (often called window chrome), perhaps adding some shadows and other effects, and presenting the final result to the display adapter.


来自的背景:

在 DirectX 中缩小尺寸时,right/bottom 边缘出现 win32 背景伪像。这可以通过应用 WS_EX_NOREDIRECTIONBITMAP 样式来纠正。由于交换链是小于还是大于 window,似乎没有 WS_EX_NOREDIRECTIONBITMAP 组合引擎将太小的矩形复制到重定向表面(因为 window大小滞后于鼠标位置/“拖动矩形”)。


实际问题

但是,WS_EX_NOREDIRECTIONBITMAP 仅适用于顶级 windows,我正在尝试将 DirectX 作为 child window 嵌入到 WPF 中,而来自child window 的背景还在继续。这让我想到了一些相关问题:

  1. (可选)当交换链小于window大小时,window的剩余部分用黑色填充()。这是从交换链复制到重定向表面的结果,其中目标步幅的剩余部分(在源宽度之后)被清零了吗?
  2. (选填)win32后台的神器是怎么出现的? Redirection Surface 是否在从交换链复制之前填充了这种颜色?
  3. (可选)重定向表面是否正在调整大小 every-time window 是否已调整大小?
  4. (必需)是否每个 child window 都有一个重定向表面,该重定向表面又被复制到顶层 window 的重定向表面。如果不是,child的win32背景神器是怎么出现的?
  5. (必填)这是否意味着嵌入到 WPF 中的 win32 window 帧速率仅限于 WPF 的可变帧速率? (将 DirectX window 嵌入 WPF 的目的是为了获得恒定的 60fps 帧速率)

我错过的是像素到达屏幕有两条路径

  1. 通过重定向表面
  2. 通过翻转演示模型

如果没有 WS_EX_NOREDIRECTIONBITMAP,交换链的内容将被复制到重定向表面的内容上。但是,在缩小大小和剪裁以防止交换链的内容延伸超过 window 时存在一个错误,剪裁太小的矩形允许看到重定向表面。当我使用 CreateSwapChainForComposition() 和 DirectComposition 获得与 CreateSwapChainForHwnd().

完全相同的行为时,我意识到了这一点

回答我需要的问题:不,使用 HwndHost 中的翻转演示模型不会限制您的 WPF 刷新率。