Direct3D中设备丢失处理
2011年3月11日 onedouble.net
? ? ?原來總發現最小化侯再打開會失去鍵盤鼠標響應,最近搞明白,原來這就是TMD的設備丟失啊,丟失了該怎么辦呢?先試著小心翼翼地問電腦,可以恢復嗎(Reset())?帶點兒小舌的顫音,非常好,就是這樣。如果丫告訴你不行,抽他丫的,然后再問,直到屈打成招表示情緒穩定可以恢復,則銷毀所有的顯存資源和所有的交換鏈(swap chains),然后調用Reset()函數恢復設備。創建時使用D3DPOOL_MANAGED標志的資源可以不需要重新載入,但D3DPOOL_DEFAULT加載的資源就需要先釋放,后重建。通常需要這樣處理的有ID3DXFont和ID3DXSprite,而.X模型什么的就不需要。
如果設備丟失,Present()函數就會“出問題”,返回值是D3DERR_DEVICELOST。所以我會在繪制結束調用present函數之后檢查調用結果以判斷是否設備丟失.
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 }
當TestCooperativeLevel()==?D3DERR_DEVICENOTRESET時,就可以恢復設備了。
于是,我們調用OnLostDevice()讓D3DPOOL_DEFAULT加載的資源釋放掉,之后,調用OnResetDevice()來恢復設備就可以了。
好在ID3DXFont和ID3DXSprite有設備丟失處理函數,直接調用就好了
1 void OnLostDevice(void)2 {
3 m_sprite->OnLostDevice();
4 m_font->OnLostDevice();
5 }
再 寫個恢復函數
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設備中的狀態啊,矩陣變換啊這些重新設置下就完成了,也就是調用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 }
轉載于:https://www.cnblogs.com/oneDouble/archive/2012/03/07/2384335.html
總結
以上是生活随笔為你收集整理的Direct3D中设备丢失处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RDLC报表系列--------钻取报表
- 下一篇: 长期股权投资和私募股权投资的区别