Direct3D中设备丢失处理
2011年3月11日 onedouble.net
? ? ?原來總發(fā)現(xiàn)最小化侯再打開會(huì)失去鍵盤鼠標(biāo)響應(yīng),最近搞明白,原來這就是TMD的設(shè)備丟失啊,丟失了該怎么辦呢?先試著小心翼翼地問電腦,可以恢復(fù)嗎(Reset())?帶點(diǎn)兒小舌的顫音,非常好,就是這樣。如果丫告訴你不行,抽他丫的,然后再問,直到屈打成招表示情緒穩(wěn)定可以恢復(fù),則銷毀所有的顯存資源和所有的交換鏈(swap chains),然后調(diào)用Reset()函數(shù)恢復(fù)設(shè)備。創(chuàng)建時(shí)使用D3DPOOL_MANAGED標(biāo)志的資源可以不需要重新載入,但D3DPOOL_DEFAULT加載的資源就需要先釋放,后重建。通常需要這樣處理的有ID3DXFont和ID3DXSprite,而.X模型什么的就不需要。
如果設(shè)備丟失,Present()函數(shù)就會(huì)“出問題”,返回值是D3DERR_DEVICELOST。所以我會(huì)在繪制結(jié)束調(diào)用present函數(shù)之后檢查調(diào)用結(jié)果以判斷是否設(shè)備丟失.
1 m_pIDirect3DDevice->EndScene();2
3 HRESULT hr;
4 hr = m_pIDirect3DDevice->Present(NULL, NULL, NULL, NULL);
5 if(hr == D3DERR_DEVICELOST)
6 {
7 if(m_pIDirect3DDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET)
8 {
9 OnLostDevice();
10 OnResetDevice();
11 }
12 }
當(dāng)TestCooperativeLevel()==?D3DERR_DEVICENOTRESET時(shí),就可以恢復(fù)設(shè)備了。
于是,我們調(diào)用OnLostDevice()讓D3DPOOL_DEFAULT加載的資源釋放掉,之后,調(diào)用OnResetDevice()來恢復(fù)設(shè)備就可以了。
好在ID3DXFont和ID3DXSprite有設(shè)備丟失處理函數(shù),直接調(diào)用就好了
1 void OnLostDevice(void)2 {
3 m_sprite->OnLostDevice();
4 m_font->OnLostDevice();
5 }
再 寫個(gè)恢復(fù)函數(shù)
1 void OnResetDevice(void)2 {
3 if(FAILED(m_pIDirect3DDevice->Reset(&d3dpp)))
4 {
5 return;
6 }
7
8 m_sprite->OnResetDevice();
9 m_font->OnResetDevice();
10
11 InitDevice();
12 }
最后,需要把D3D設(shè)備中的狀態(tài)啊,矩陣變換啊這些重新設(shè)置下就完成了,也就是調(diào)用InitDevice()。
1 void InitDevice()2 {
3 m_pIDirect3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
4
5 m_pIDirect3DDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
6
7 m_pIDirect3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
8 m_pIDirect3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
9 m_pIDirect3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
10
11 D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f );
12 m_pIDirect3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );
13
14 vEyeVec=D3DXVECTOR3(0.0f,0.0f,-1.0f);
15 vLookatVec=D3DXVECTOR3(0.0f,0.0f,0.0f);
16 vUpVec=D3DXVECTOR3(0.0f,1.0f,0.0f);
17 D3DXMatrixLookAtLH( &matView, &vEyeVec, &vLookatVec, &vUpVec );
18 m_pIDirect3DDevice->SetTransform( D3DTS_VIEW, &matView );
19
20 }
轉(zhuǎn)載于:https://www.cnblogs.com/oneDouble/archive/2012/03/07/2384335.html
總結(jié)
以上是生活随笔為你收集整理的Direct3D中设备丢失处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RDLC报表系列--------钻取报表
- 下一篇: 长期股权投资和私募股权投资的区别