gpt4 book ai didi

graphics - 如何使用 IDXGISwapChain 和 ID3D11Device/ID3D11DeviceContext 呈现到不同的窗口?

转载 作者:行者123 更新时间:2023-12-03 06:24:29 29 4
gpt4 key购买 nike

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

我之前也用 D3D11 构建过一个游戏渲染器,这也很棒,因为状态管理和线程接口(interface)设计得很好,你甚至可以针对在野外仍然很常见的 D3D 9 级硬件(而不是到 D3D 10,只能定位 10 或更好)。

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

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

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

最佳答案

我最终得到的答案是为每个单独的显示区域创建一个后台缓冲区,而不是根据后台缓冲区调整其大小。我想,在一个桌面构图和透明度可以乐意在我背后“做任何事”的世界里,这可能对系统有帮助。我想,要学会爱上 VVM 系统 :-)(用于虚拟视频内存的 VVM)

关于graphics - 如何使用 IDXGISwapChain 和 ID3D11Device/ID3D11DeviceContext 呈现到不同的窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7185984/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com