1

来自Kenny Kerr 博客的上下文:

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

在某些时候,独立于任何给定的窗口,合成引擎会根据最新的一批更改决定是时候合成桌面了。这包括将所有这些重定向表面组合在一起,添加非客户区域(通常称为窗口镶边),可能添加一些阴影和其他效果,并将最终结果呈现给显示适配器。


上一个 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 帧速率)
4

1 回答 1

0

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

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

如果没有WS_EX_NOREDIRECTIONBITMAP交换链的内容被复制到重定向表面的内容上。但是,在调整大小时存在一个错误,并且为防止交换链的内容延伸到窗口之外,将矩形剪辑得太小以防止看到重定向表面。CreateSwapChainForComposition()当我使用与使用 DirectComposition得到完全相同的行为时,我意识到了这一点CreateSwapChainForHwnd()

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

于 2020-07-29T05:37:08.210 回答