设备丢失

来源:互联网 发布:莫知我哀小说 编辑:程序博客网 时间:2024/05/01 05:50

一个Direct3D设备, 有两种状态: 操作状态或丢失状态.
操作状态: 是设备的正常状态, 设备按预期运行, 并且能present所有渲染效果

丢失状态: 所有渲染操作悄然失败, IDirect3DDevice9::present返回错误码D3DERR_DEVICELOST

 

可能导致设备丢失的情况有:

窗口丢失焦点, 用户按下了ALT+TAB, 弹出了一个系统对话框, 电源管理事件, 另一个应用程序进行全屏操作

IDirect3DDevice9::Reset调用失败时, 设备也会被设置为丢失状态

 

如何发现设备丢失:

IDirect3DDevice9::present返回错误码D3DERR_DEVICELOST或D3DERR_DRIVERINTERNALERROR(这种情况下基本上要exit了)

IDirect3DDevice9::TestCooperativeLevel返回错误码D3DERR_DEVICELOST或D3DERR_DRIVERINTERNALERROR(DX10整合到present中了)


发现设备丢失后:

1.查询设备状态, 看是否可以将之恢复到操作状态. 如果不行, 则必须要等到设备可以被恢复为止.

2.释放所有在D3DPOOL_DEFAULT中分配的资源, 包括用IDirect3DDevice9::CreateRenderTarget和IDirect3DDevice9::CreateDepthStencilSurface方法创建的资源. (不进行这一步, 下一步的Reset操作会失败)

3.调用IDirect3DDevice::Reset进行恢复. Reset方法是当设备丢失时, 唯一有效的方法, 并且是应用程序可用来把设备从丢失状态恢复到操作状态的唯一方法.

4.重建在步骤2中释放的资源, 同时还需要重新设置state等

 

管理资源:

1.资源管理是将资源从系统内存提升到设备可访问存储器及从设备可访问存储器中抛弃的过程

2.D3DPOOL_MANAGED标志指定一个由系统管理的资源。由系统管理的资源在设备的丢失状态和操作状态间的转换中持续存在。通过调用IDirect3DDevice9::Reset设备可以被重置,并且这类资源可以继续正常运作而无需重新载入图片。但是,如果设备必须被销毁和重建,那么所有用D3DPOOL_MANAGED创建的资源也必须被重建

3.D3DPOOL_DEFAULT标志指定把资源放在默认的池中。在默认的池中的资源在设备从丢失状态到操作状态的转换过程中不持续存在,这些资源必须在调用Reset之前释放,然后重建

4.不是所有的类型和用途都支持资源管理。例如,用D3DUSAGE_RENDERTARGET标志创建的对象不支持资源管理。另外,不建议对需要频繁改变其内容的对象使用资源管理。例如,在某些硬件上对一个每帧都需改变的顶点缓存进行自动管理会严重降低性能。但是,对纹理资源来说这不是一个问题

 

DXUT代码:

MainLoop

 

DXUTReset3Denvironment9

 

伪代码:

 

原创粉丝点击