c++ - 如何有效地调整 DirectX 窗口的大小?

标签 c++ windows visual-c++ directx

我查看了这个站点示例:http://www.codesampler.com/dx9src/dx9src_6.htm

但是代码很奇怪:它释放了每个纹理、顶点缓冲区,所有的东西!然后再次构建它们:从磁盘加载模型……我认为效率不高! OpenGL 可以动态调整窗口大小而没有此类限制。我如何才能像 OpenGL 那样做:无需释放程序中的所有资源即可高效地调整窗口大小?

我尝试了上面链接示例中的代码,没有那些 invalidateDeviceObjects/restoreDeviceObjects 函数调用,但它没有工作..所以我想它必须完成?我希望不会,否则在大型应用程序中调整窗口大小会很痛苦,因为您在纹理、模型等中分配了数百兆字节的数据。

最佳答案

这是 d3d9 设计的结果。调整 d3d9 窗口的大小需要调用 IDirect3DDevice9::Reset ,以及来自文档:

Calling IDirect3DDevice9::Reset causes all texture memory surfaces to be lost, managed textures to be flushed from video memory, and all state information to be lost.

原来如此。实际上,从游戏开始到游戏结束,您根本不会改变显示器的分辨率。通常你在游戏开始时设置分辨率,允许在一些特殊设置屏幕中重置。

现在我要补充一点,如果您使用的是 D3D9,则可以使用一个特殊的资源分配标志 (D3DPOOL_MANAGED),它实际上会为您负责重新加载资源。因此,系统内存中自动维护了所有纹理、顶点缓冲区等的本地(系统内存)拷贝,并且当 GPU 重置时,这些纹理等会自动复制回 GPU。

请记住,如果您使用较新的 IDirect3DDevice9Ex,则不允许使用 D3DPOOL_MANAGED

关于c++ - 如何有效地调整 DirectX 窗口的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764013/

相关文章:

c++ - 在 C++ 中写入 IPC SHM 时无法读取完整的字符串

c++ - 为字符串生成不同的条目(要使用的点)

c++ - 以模板作为模板参数的函数

windows - 在 Windows 中编程的编码配色方案,而不仅仅是 Visual Studio

c++ - 如何获得浮点类型 C/C++ 的细节

c# - 如何将 "X"(清除文本框)放入文本框内?

c++ - 如何使用 C++ 获取 SQL SERVER 安装路径?

c++ - 如何使两个不同长度的双变量变得相等

c++ - VC中如何改变ContextMenu的顺序?

c++ - 如何判断哪个值触发了 RegNotifyChangeKeyValue?