窗口合成引擎 (DWM) 中的背景色伪影



Kenny Kerr博客中的上下文:

WindowsVista推出了一项名为"桌面窗口管理器"的服务。这个名字过去和现在都具有误导性。可以把它想象成Windows合成引擎或合成器。这个合成引擎完全改变了在桌面上呈现应用程序窗口的方式。与允许每个窗口直接渲染到显示器或显示适配器不同,每个窗口都渲染到屏幕外表面或缓冲区。系统为每个顶级窗口分配一个这样的表面,并且所有GDI、Direct3D,当然还有Direct2D图形都被渲染到这些表面。这些屏幕外表面被称为重定向表面,因为GDI绘图命令甚至Direct3D交换链表示请求都被重定向或复制(在GPU内(到重定向表面。

在某个时刻,独立于任何给定的窗口,合成引擎决定是时候在给定最新一批更改的情况下合成桌面了。这包括将所有这些重定向曲面组合在一起,添加非客户端区域(通常称为windowchrome(,也许添加一些阴影和其他效果,并将最终结果显示给显示适配器。


上一个SO问题的背景(见图(:

在DirectX中向下调整大小时,在右/下边缘会出现win32背景的伪影。这可以通过应用WS_EX_NOREDIRECTIONBITMAP样式来纠正。由于交换链比窗口小还是大并不重要,因此在没有WS_EX_NOREDIRECTIONBITMAP的情况下,合成引擎似乎会将太小的矩形复制到重定向曲面(因为窗口大小落后于鼠标位置/"拖动矩形"(。


实际问题

然而,WS_EX_NOREDIRECTIONBITMAP只适用于顶级窗口,我正在尝试将DirectX作为子窗口嵌入到WPF中,并且来自子窗口背景的工件仍然存在。这让我想到了一些相关的问题:

  1. (可选(当交换链小于窗口大小时,窗口的其余部分将填充为黑色(见图(。这是从交换链复制到重定向曲面的结果吗?在重定向曲面中,目标步幅的剩余部分(在源宽度之后(被清零
  2. (可选(来自win32背景的工件是如何出现的?在从交换链复制之前,重定向曲面是否已填充此颜色
  3. (可选(是否每次调整窗口大小时都会调整重定向曲面的大小
  4. (必需(每个子窗口是否都有一个重定向曲面,该曲面将依次复制到顶级窗口的重定向曲面。如果没有,孩子的win32背景工件是如何出现的
  5. (必需(这是否意味着嵌入WPF的win32窗口的帧速率仅限于WPF的可变帧速率?(将DirectX窗口嵌入WPF的目的是获得恒定的60fps帧速率(

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

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

如果没有WS_EX_NOREDIRECTIONBITMAP,交换链的内容将复制到重定向曲面的内容上。然而,在向下调整大小和剪裁时存在一个错误,以防止交换链的内容延伸到窗口之外,剪裁过小的矩形,从而可以看到重定向曲面。当我使用带有DirectComposition的CreateSwapChainForComposition()获得与CreateSwapChainForHwnd()完全相同的行为时,我意识到了这一点。

为了回答我的问题:不,使用HwndHost的翻转演示模型并不会限制你的WPF刷新率。

最新更新