Graphics 如何使用IDXGISwapChain和ID3D11Device/ID3D11DeviceContext显示到不同的窗口?

Graphics 如何使用IDXGISwapChain和ID3D11Device/ID3D11DeviceContext显示到不同的窗口?,graphics,windows-7,direct3d,direct3d11,dxgi,Graphics,Windows 7,Direct3d,Direct3d11,Dxgi,以前,当我构建工具时,我使用了D3D版本9,其中对Present()的调用可以获取一个目标窗口和矩形,因此您可以从单个设备绘制到多个不同的窗口。当使用D3D加速桌面应用程序和/或构建工具而不是游戏时,这非常好 我以前也用D3D11构建了一个游戏渲染器,这也很棒,因为状态管理和线程接口设计得很好,你甚至可以针对D3D9级硬件,这在野外仍然很常见(与D3D10不同,D3D10只能针对10级或更好) 但是,现在我想用D3D11构建一个工具。不幸的是,从D3D11CreateDeviceAndSwapC

以前,当我构建工具时,我使用了D3D版本9,其中对Present()的调用可以获取一个目标窗口和矩形,因此您可以从单个设备绘制到多个不同的窗口。当使用D3D加速桌面应用程序和/或构建工具而不是游戏时,这非常好

我以前也用D3D11构建了一个游戏渲染器,这也很棒,因为状态管理和线程接口设计得很好,你甚至可以针对D3D9级硬件,这在野外仍然很常见(与D3D10不同,D3D10只能针对10级或更好)

但是,现在我想用D3D11构建一个工具。不幸的是,从D3D11CreateDeviceAndSwapChain()返回的IDXGISwapChain似乎“记住”了它的HWND,只想显示给该窗口。这是非常不方便的,因为我可能有大量的窗口,每个窗口都需要绘制相当简单的图形,并且只响应WM_绘制(同样,这是用于工具,而不是游戏)

我想做的是保存回缓冲RAM。具体地说,我曾经能够创建一个后台缓冲区,即桌面大小,我知道它可以满足所有渲染需求,然后这就是分配的单个副本。即使有10个重叠窗口,它们都通过相同的后台缓冲区进行渲染,因此除了初始分配之外,不会浪费内存。我可以创建不是交换链的纹理,并将其用作“渲染目标”,但如果不读回位图并将其复制到DIBSection中,我找不到一种好方法来呈现任意客户端窗口的任意矩形,这将非常低效。而且,没有办法创建多个交换链,并让它们共享同一个后缓冲区


我所能做的最好的事情就是为每个窗口创建一个交换链,并将每个交换链的后缓冲区调整为非常小的大小,但渲染交换链时除外,此时我将调整其大小以匹配窗口。然而,这似乎效率低下,因为调整目标的大小并不是AFAICT的“免费”操作。那么,有没有更好的方法呢?

我最后得到的答案是,为每个单独的显示区域创建一个后缓冲区,而不是将其大小设置为后缓冲区。我想,在一个桌面合成和透明度可以在我背后“做任何事情”的世界里,这可能对系统有帮助。 学会爱上VVM系统,我想:-)(虚拟视频存储器的VVM)