博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectX3D设备丢失(lost device)的处理(一)
阅读量:5927 次
发布时间:2019-06-19

本文共 1801 字,大约阅读时间需要 6 分钟。

hot3.png

在创建时使用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/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 );
}

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

转载于:https://my.oschina.net/u/3773235/blog/1612633

你可能感兴趣的文章
快速排序——Java
查看>>
unity游戏与我
查看>>
187. Repeated DNA Sequences
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
行列式的乘法定理
查看>>
linux下内存释放问题
查看>>
让Java和JavaScript进行交互
查看>>
LINQ之路12:LINQ Operators之数据转换(Projecting)
查看>>
SQL Server:数据库角色
查看>>
分享8个超棒的基于HTML5和jQuery的开发教程
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
SpringMVC+Swagger详细整合
查看>>
计算机视觉领域最全汇总(第2部分)
查看>>
[译] 所有你需要知道的关于完全理解 Node.js 事件循环及其度量
查看>>
(六十九)复合语句
查看>>
我的友情链接
查看>>