DirectX3D设备丢失(lost device)的处理(一)

在建立时使用D3DPOOL_MANAGED标志的资源能够不须要从新载入,但D3DPOOL_DEFAULT加载的资源就须要先释放,后重建。

一般须要这样处理的有ID3DXFont和ID3DXSprite,而.X模型什么的就不须要。
在发现设备丢失时,咱们要调用 OnLostDevice(void)函数让D3DPOOL_DEFAULT加载的资源释放掉。
好在ID3DXFont和ID3DXSprite有设备丢失处理函数,直接调用就行了函数

void OnLostDevice(void)
{

    m_sprite->OnLostDevice();
    m_font->OnLostDevice();
}
oop


但是,怎么知道设备丢失了呢?
若是设备丢失,Present()函数就会“出问题”,返回值是D3DERR_DEVICELOST。spa

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();
    }
}
3d

TestCooperativeLevel()== D3DERR_DEVICENOTRESET时,就能够恢复设备了。
因而,咱们调用
OnLostDevice()让D3DPOOL_DEFAULT加载的资源释放掉,以后,调用OnResetDevice()来恢复设备就能够了。

怎么恢复设备呢?
orm

void OnResetDevice(void)
{
    
if(FAILED(m_pIDirect3DDevice->Reset(&d3dpp)))
    {
        
return;
    }

    m_sprite
->OnResetDevice();
    m_font
->OnResetDevice();

    InitDevice();
}
资源

先让D3D设备reset,而后调用ID3DXFont和ID3DXSprite的恢复函数,最后,须要把D3D设备中的状态啊,矩阵变换啊这些从新设置下就完成了,也就是调用InitDevice()。
 it

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/41.0f1.0f1000.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 );

}
form


啊,这样设备丢失就处理好了d3

相关文章
相关标签/搜索