DirectX 3D 设备丢失(lost device)的处理

原创 2009年10月17日 13:13:00

当初觉得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

d3d 设备丢失和reset

http://www.cnblogs.com/kex1n/archive/2011/04/25/2026877.html DirectX 3D 设备丢失(lost devic...
  • xuxinhua
  • xuxinhua
  • 2011-10-13 18:04:38
  • 4180

坑爹的DirectX9设备丢失问题

今天遇到一个设备丢失的问题,浪费我好长时间才跟出来,真坑爹!结果是用到了一个ID3DXEffect接口,设备丢失时没有处理造成的。每次遇到设备丢失的问题都要跟踪好长时间才能搞定。所以给个建议:每当在系...
  • rabbit729
  • rabbit729
  • 2012-01-16 17:46:05
  • 1610

老天爷,搞明白什么叫D3D设备丢失了,及设备丢失后如何办了。。。

http://blog.csdn.net/cglover/archive/2007/06/01/1634300.aspx directx中丢失的设备(lo...
  • zdl1016
  • zdl1016
  • 2007-07-04 15:04:00
  • 12817

directx中丢失的设备(lost device)

丢失的设备一个Microsoft? Direct3D?可以处于操作状态或丢失状态。操作状态是设备的正常状态,设备按预期运行并present所有渲染结果。当事件发生时,如全屏应用程序失去键盘输入焦点,设...
  • pizi0475
  • pizi0475
  • 2011-03-22 15:03:00
  • 1235

D3D中设备丢失的处理

转载自:http://www.cnblogs.com/graphics/archive/2010/08/21/1805548.html 什么是设备丢失 D3D中设备(Device)有两种状...
  • Blues1021
  • Blues1021
  • 2015-05-06 07:41:41
  • 1278

directx中丢失的设备(lost device)

   directx中丢失的设备(lost device) 丢失的设备一个Microsoft? Di...
  • cglover
  • cglover
  • 2007-06-01 15:46:00
  • 3769

VMR9 设备丢失 lost device

在direct3d程序里面,设备丢失是个令人头痛的问题之一。 如果整个设备的创建和使用都是由自己控制,如game编程,相对来说好处理,即所有资源都注册到一个管理对象里,统一release,然后res...
  • xuxinhua
  • xuxinhua
  • 2013-02-18 13:14:42
  • 880

Direct3d 设备丢失 (device lost) .

[-] 什么时候设备丢失如何发现设备丢失发现设备丢失后4管理资源处理设备丢失人工制造设备丢失 1.什么时候设备丢失   一个Direct3D设备, 有两种状态: 操作状态或丢失...
  • xiangzhang321
  • xiangzhang321
  • 2012-12-19 11:46:16
  • 619

Direct3d 设备丢失 (device lost)

http://blog.csdn.net/kuangfengwu/article/details/7674074 1.什么时候设备丢失   一个Direct3D设备,...
  • pizi0475
  • pizi0475
  • 2015-03-23 15:27:15
  • 470

56 WebGL处理响应上下文丢失

这将是WebGL基础的最后一节的更新,以后请关注three.js框架的相关学习的更新。案例查看地址:点击这里WebGL使用了计算机的图形硬件,而这部分资源是被操作系统管理,由包括浏览器在内的多个应用程...
  • qq_30100043
  • qq_30100043
  • 2017-07-02 16:17:36
  • 588
收藏助手
不良信息举报
您举报文章:DirectX 3D 设备丢失(lost device)的处理
举报原因:
原因补充:

(最多只允许输入30个字)