低手交流,高手勿入
當(dāng)初覺得DX中設(shè)備丟失很討厭,差點就投奔OpenGL了。
不過現(xiàn)在發(fā)現(xiàn)其實也沒那么麻煩啦,寫點東西,給不清楚
設(shè)備丟失怎么處理的同學(xué)參考下。
在創(chuàng)建時使用D3DPOOL_MANAGED標(biāo)志的資源可以不需要重新載入,但D3DPOOL_DEFAULT加載的資源就需要先釋放,后重建。
通常需要這樣處理的有ID3DXFont和ID3DXSprite,而.X模型什么的就不需要。
在發(fā)現(xiàn)設(shè)備丟失時,我們要調(diào)用
OnLostDevice(void)函數(shù)讓D3DPOOL_DEFAULT加載的資源釋放掉。
好在ID3DXFont和ID3DXSprite有設(shè)備丟失處理函數(shù),直接調(diào)用就好了
void?OnLostDevice(void)
{
??? m_sprite->OnLostDevice();
????m_font->OnLostDevice();
}
可是,怎么知道設(shè)備丟失了呢?
如果設(shè)備丟失,Present()函數(shù)就會“出問題”,返回值是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時,就可以恢復(fù)設(shè)備了。
于是,我們調(diào)用OnLostDevice()讓D3DPOOL_DEFAULT加載的資源釋放掉,之后,調(diào)用
OnResetDevice()來恢復(fù)設(shè)備就可以了。
怎么恢復(fù)設(shè)備呢?
void?OnResetDevice(void)
{
????if(FAILED(m_pIDirect3DDevice->Reset(&d3dpp)))
????{
????????return;
????}
????m_sprite->OnResetDevice();
????m_font->OnResetDevice();
????InitDevice();
}
先讓D3D設(shè)備reset,然后調(diào)用ID3DXFont和ID3DXSprite的恢復(fù)函數(shù),最后,需要把
D3D設(shè)備中的狀態(tài)啊,矩陣變換啊這些重新設(shè)置下就完成了,也就是調(diào)用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?);
}
啊,這樣設(shè)備丟失就處理好了
//
tag:DirectX 3D? d3d lost device TestCooperativeLevel OnLostDevice 恢復(fù)設(shè)備 設(shè)備丟失 DeviceLost