D3D11与D3D9全屏/窗口化切换差异
戎桐
2023-12-01
D3D11或D3D10中,程序由窗口化切换到全屏,只需要简单的调用
IDXGISwapChain::SetFullscreenState 来改变换链的状态即可实现切换,开发者不用考虑资源丢失与重建的问题。
在D3D9中则不一样,D3D9中调用IDirect3DDevice9::Reset 来重建设备。
在重建设置之前呢,必须得手动释放与这个设备相关联的资源,不然函数调用会失败,
哪些资源是要释放的,哪些又不用释放呢?
资源在创建的时候,使用D3DPOOL_MANAGED标志创建可以不用释放,
资源在创建的时候,使用D3DPOOL_DEFAULT标志则必须释放,
比如ID3DXFont和ID3DXSprite就有自带的OnLostDevice方法,来暂时与device失去联系,重建device再调OnResetDevice方法恢复。
资源释放之后,调用 IDirect3DDevice9::Reset 来重建设备,设备重建之后,得重新恢复资源,设备在重建之前的相关矩阵变换,渲染状态及采样状态等都得重新恢复。
由上面可总结D3D9中窗口切换过程
1、OnLostDevice 这里处理重建前的资源释放
2、ResetDevice 重建device
3、OnResetDevice 恢复资源及相关状态
//-------------------设备丢失处理-----------------
IDirect3DDevice9::Present 的返回值能检测一个设备此时的状态是不是丢失状态(丢失并不等于此时的设备不可用了),这里只是与之前创建时的显卡失去联系,
IDirect3DDevice9::TestCooperativeLevel()==D3DERR_DEVICENOTRESET
检测设备是否为未恢复状态,如果是,则执行OnLostDevice -- Reset --- OnResetDevice 流程。