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

Roo*_*kie 4 c++ windows directx visual-c++

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

但代码相当奇怪:它释放了每个纹理,顶点缓冲区,一切!然后再次构建它们:从磁盘加载模型......我不认为这是非常有效的!OpenGL可以在没有这些限制的情况下进行窗口大小调整.我怎么能像OpenGL一样做:高效的窗口调整大小而不需要释放程序中的每个资源?

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

bob*_*obo 7

这是d3d9设计的结果.调整d3d9窗口的大小需要调用IDirect3DDevice9 :: Reset,并从文档中调用:

调用IDirect3DDevice9 :: Reset会导致所有纹理内存表面丢失,托管纹理将从视频内存中刷新,并且所有状态信息都将丢失.

所以它就是这样.实际上,从游戏开始到游戏结束,你根本不会改变显示器的分辨率.通常您在游戏开始时设置分辨率,允许在某些特殊设置屏幕中重置.

现在我应该补充一点,如果你使用D3D9,你可以使用一个特殊的资源分配标志(D3DPOOL_MANAGED)来实际负责为你重新加载资源.因此,所有纹理,顶点缓冲区等的本地(系统内存)副本会自动保存在系统内存中,当GPU重置时,这些纹理等会自动复制回GPU.

D3DPOOL_MANAGED如果您使用的是新版本,请不要忘记IDirect3DDevice9Ex.