-
Direct3d
设备丢失
(device lost)
1.
什么时候设备丢失
一个<
/p>
Direct3D
设备
,
有两种状态
:
操作状态或丢失状态。
操作状态
:
是设备的正常状态
,
设备按预期运行
,
并且能
present
所有渲染效果
丢失状态
:
所有渲染操作悄然失败
,
IDire
ct3DDevice9::present
返回错误码
D3D
ERR_DEVICELOST
查帮助
Lost Devices (Direct3D 9)
看更详细介绍,用最民工
的语言简略说说:什么时候设备会丢失
?
(
1
)全
屏模式下当前
Direct3D
窗口丢失焦点时
(
2
)有多个
Direct3D
窗口,其中一个进入全屏则其它设备
丢失
(多显卡时情况则不同,
每个显卡设备只有一个能全屏)
系统休眠或者锁定
(Win+L)
(
3
)
IDi
rect3DDevice9::Reset
调用失败时
,
设备也会被设
置为丢失状态
(
4
)重新设置
Dir
ect3D device
参数时
2.
如何发现设备丢失
IDirect3DDevice9::present
p>
返回错误码
D3DERR_DEVICELOST
或
D3DERR_DRIVERIN
TERNALERROR(
这种情况下基本上
要
exit
了
)
IDirec
t3DDevice9::TestCooperativeLevel
返回错误码
p>
D3DERR_DEVICELOST
或
D
3DERR_DRIVERINTERNALERROR(DX10
整合到
present
中了
)
不论通过任何方式发生了设备丢失,所有的操作几乎都会失<
/p>
效,
只有
Release()
可以用——其实
D3D
会保证有部分操作
可以成功,但
是也仅仅是“可以”成功而不是
“一定”成功,
所以你还不如认定
丢失的时候全都会失败比较好
——以及
IDirect3DDevice9::TestC
ooperativeLevel
。因此在设备丢失
之后,你应
该停止整个游戏循环,而通过反复调用
IDirect3DD
evice9::TestCooperativeLevel
判断设备是否可
用。
『
IDirect3DDevice9::
TestCooperativeLevel
』
这个
方法检测当前的设备状态。
p>
返回值有四种:
D3D_OK
一切正
常,
D3DERR_DEVICELOST
设
备丢失,
D3DERR_DEVICENOTRESET
设备<
/p>
可以
Reset
。另外还有
D3D9
新增的
D3DE
RR_DRIVERINTERNALERROR
,遇到这个你就完蛋
< br>了,基本不可能恢复了,终止程序吧。
按照顺序来讲,
如果游戏在正常运行
,
D3D_OK
会返回;
如果发生了设
备丢失并且在这个时候不能恢复,比如全屏幕
模式的时候
p>
用户切换到了
Windows
桌面,就会返
回
D3DERR_DEVICELOST
;如果用户又切换回了
游戏,设备
可以恢复了(还没恢复呢!只是“可
以”恢复而已)
,就会返回
D3DERR_DEVI
CENOTRESET
。
另外,
IDirect3DDevice9::Present
也会返
回类似的值,不
过你最好别指望这个,
老老实实的用
TestCooperativeLevel
。
因
为
Present
在设备可以恢复的
时候还是返回
D3DERR_DEVICELOST
(外一句:
D3D10
的时候
TestCoope
rativeLevel
就会完全整合到
Present
里面了,可喜可贺可喜可贺)
3.
发现设备丢失后
1.
查询设备状态
,
看是否可以将之恢复到操作状态
.
如果不
行
,
则必须要等到设备可以被恢复为止
.
2.
释放所有在
D3DPOOL_DEFAULT
中分配的资源
,
包括用
IDirect3DDevice9::CreateRend
erTarget
和
IDirect
3DDevice9::CreateDepthStencilSurface
方法创
建的
资源
.
(
不进行这一步
,
下一步的
Reset
操作会失败
)
3.
调用
IDirect3DDevice::Reset
进行恢复
p>
.
Reset
方法是当设
备丢失时
,
唯一有效的方法
,
并且是应用程序可
用来把设备
从丢失状态
恢复到操作状态的唯一方法
.
4.
重建在步骤
2
中释放的资源
,
同时还需要重
新设置
state
等
4.
管理资源
1.<
/p>
资源管理是将资源从系统内存提升到设备可访问存储器及
从设备可
访问存储器中抛弃的过程
2.D3DPOOL_MANAGED
标志指定一个由系统管理的资源
。
由系统管理的资源在设备的丢失状态和操作状态间的转换
中持
续存在。通过调
用
IDirect3
DDevice9::Reset
设备可以被重置,
并且这类资
源
可以继续正常运作而无需重新载入图片。但是,如果设备必
须
被销毁和
重建,那么所有用
D3DP
OOL_MANAGED
创建的资源也必
须被重建
3.D3DPOOL
_DEFAULT
标志指定把资源放在默认的池中。
在默认的池
中的资源在设备从丢失状态到操作状态的转换
过程中不持续存在,
这些资源必须在调用
Reset
之
前释放,然后重建
4.
不是所有的类型和用途都支持资源管理。例如,用
D3DUSAGE_RENDERTARGET
标志创建的对象不支持资
源管理。另外,不建议对需要
频繁改变其内容的对
象使用资源管理。例如,在某些硬件上
对一个每帧都需改变的顶点缓存进行自动管理会严
重降低