低手交流,高手勿入
當初覺得DX中設備丟失很討厭,差點就投奔OpenGL了。
不過現在發現其實也沒那么麻煩啦,寫點東西,給不清楚
設備丟失怎么處理的同學參考下。
在創建時使用D3DPOOL_MANAGED標志的資源可以不需要重新載入,但D3DPOOL_DEFAULT加載的資源就需要先釋放,后重建。
通常需要這樣處理的有ID3DXFont和ID3DXSprite,而.X模型什么的就不需要。
在發現設備丟失時,我們要調用
OnLostDevice(void)函數讓D3DPOOL_DEFAULT加載的資源釋放掉。
好在ID3DXFont和ID3DXSprite有設備丟失處理函數,直接調用就好了
void?OnLostDevice(void)
{
??? m_sprite->OnLostDevice();
????m_font->OnLostDevice();
}
可是,怎么知道設備丟失了呢?
如果設備丟失,Present()函數就會“出問題”,返回值是D3DERR_DEVICELOST。
m_pIDirect3DDevice->EndScene();
HRESULT?hr;
hr?=?m_pIDirect3DDevice->Present(NULL,?NULL,?NULL,?NULL);
if(hr?==?D3DERR_DEVICELOST)
{
??? if(m_pIDirect3DDevice->TestCooperativeLevel()?==?D3DERR_DEVICENOTRESET)
??? {
??????? OnLostDevice();
??????? OnResetDevice();
??? }
}
TestCooperativeLevel()==?D3DERR_DEVICENOTRESET時,就可以恢復設備了。
于是,我們調用OnLostDevice()讓D3DPOOL_DEFAULT加載的資源釋放掉,之后,調用
OnResetDevice()來恢復設備就可以了。
怎么恢復設備呢?
void?OnResetDevice(void)
{
????if(FAILED(m_pIDirect3DDevice->Reset(&d3dpp)))
????{
????????return;
????}
????m_sprite->OnResetDevice();
????m_font->OnResetDevice();
????InitDevice();
}
先讓D3D設備reset,然后調用ID3DXFont和ID3DXSprite的恢復函數,最后,需要把
D3D設備中的狀態啊,矩陣變換啊這些重新設置下就完成了,也就是調用InitDevice()。
void?InitDevice()
{
m_pIDirect3DDevice->SetRenderState(?D3DRS_ZENABLE,?TRUE?);
m_pIDirect3DDevice->SetRenderState(?D3DRS_AMBIENT,?0xffffffff?);
m_pIDirect3DDevice->SetSamplerState(0,?D3DSAMP_MAGFILTER,?D3DTEXF_LINEAR);
m_pIDirect3DDevice->SetSamplerState(0,?D3DSAMP_MINFILTER,?D3DTEXF_LINEAR);
m_pIDirect3DDevice->SetSamplerState(0,?D3DSAMP_MIPFILTER,?D3DTEXF_POINT);
D3DXMatrixPerspectiveFovLH(?&matProj,?D3DX_PI/4,?1.0f,?1.0f,?1000.0f?);
m_pIDirect3DDevice->SetTransform(?D3DTS_PROJECTION,?&matProj?);
vEyeVec=D3DXVECTOR3(0.0f,0.0f,-1.0f);
vLookatVec=D3DXVECTOR3(0.0f,0.0f,0.0f);
vUpVec=D3DXVECTOR3(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(?&matView,?&vEyeVec,?&vLookatVec,?&vUpVec?);
m_pIDirect3DDevice->SetTransform(?D3DTS_VIEW,?&matView?);
}
啊,這樣設備丟失就處理好了
//
tag:DirectX 3D? d3d lost device TestCooperativeLevel OnLostDevice 恢復設備 設備丟失 DeviceLost