如何有效调整DirectX窗口?

我看了这个网站的例子: http : //www.codesampler.com/dx9src/dx9src_6.htm

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

我试过上面的链接示例中的代码,没有那些invalidateDeviceObjects / restoreDeviceObjects函数调用,但它没有工作..所以我想这一定是要做的? 我希望没有,或者窗口大小调整将是一个大的应用程序,你有纹理,模型等数百兆字节的数据分配的痛苦。

Solutions Collecting From Web of "如何有效调整DirectX窗口?"

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

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

所以它就是这样。 实际上,从游戏开始到游戏结束,实际上并没有习惯性地改变显示器的分辨率。 通常你在游戏开始时设置分辨率,允许在一些特殊的设置屏幕上重置。

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

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

在一个非游戏业务应用程序中,频繁调整窗口大小是UI的重要组成部分,我通过以检测到的全屏分辨率将D3D设备创建为内存设备来解决此问题,然后在CWnd :: OnDraw中使用StretchBlt (…)调整内存位图的大小,因为它正在从后台缓冲区写入屏幕。 这对于高帧速率动画来说不是一个好的解决方案,但是在相对静态的视图情况下,用户的动作控制对象/视图动作比起拆除和重新创建方法更好。