来自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 中,并且来自子窗口背景的工件仍在通过。这让我想到了一些相关的问题:
- (可选)当交换链小于窗口大小时,窗口的其余部分被填充为黑色(见图)。这是从交换链复制到重定向表面的结果,其中目标步幅的剩余部分(在源宽度之后)被清零?
- (可选)win32后台的神器是怎么出现的?在从交换链复制之前,重定向表面是否填充了这种颜色?
- (可选)是否每次调整窗口大小时都会调整重定向表面的大小?
- (必需)每个子窗口是否都有一个重定向表面,该重定向表面又被复制到顶级窗口的重定向表面。如果没有,孩子的win32后台神器是怎么出现的?
- (必填)这是否意味着嵌入到WPF中的win32窗口的帧率仅限于WPF的可变帧率?(将 DirectX 窗口嵌入 WPF 的目的是获得恒定的 60fps 帧速率)