以前,当我构建工具时,我使用的是 D3D 版本 9,其中对 Present() 的调用可以获取目标窗口和矩形,因此您可以从单个设备绘制到许多不同的窗口中。这在使用 D3D 加速桌面应用程序和/或构建工具而不是游戏时非常有用!
我之前也用 D3D11 构建了一个游戏渲染器,这也很棒,因为状态管理和线程接口设计得很好,你甚至可以针对在野外仍然很常见的 D3D 9 级别的硬件(相对于 D3D 10 ,只能针对 10 岁及以上)。
但是,现在我想用 D3D11 构建一个工具。不幸的是,从 D3D11CreateDeviceAndSwapChain() 返回的 IDXGISwapChain 似乎“记住”了它的 HWND,并且只想呈现给那个窗口。这是非常不方便的,因为我可能有大量的窗口,每个窗口都需要相当简单的图形绘制到它们上,并且只响应 WM_PAINT(同样,这是一个工具,而不是游戏)。
我想要做的是节省后台缓冲 RAM。具体来说,我曾经能够创建一个后台缓冲区,即桌面大小,我知道它可以满足所有渲染需求,然后就是分配的单个副本。即使有 10 个重叠的窗口,它们都通过同一个后台缓冲区进行渲染,因此除了初始分配之外,不会浪费内存。我可以创建不是交换链的纹理,并将它们用作“渲染目标”,但是我找不到一种很好的方法来呈现给任意客户端窗口的任意矩形,而无需读取位图并将其复制到DIBSection,这将是非常低效的。此外,没有办法创建许多交换链,并让它们共享相同的后台缓冲区。
我能做的最好的事情是为每个窗口创建一个交换链,并将每个交换链的后台缓冲区调整为非常小,除非我渲染到交换链,此时我调整它的大小以匹配窗口。但是,这似乎效率低下,因为调整目标的大小不是“免费”操作 AFAICT。那么,有没有更好的方法呢?