当前位置: 首页 > 工具软件 > D3D9On12 > 使用案例 >

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 流程。
 类似资料: