ImageVerifierCode 换一换
格式:DOCX , 页数:5 ,大小:17.22KB ,
资源ID:7079141      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7079141.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Direct3d 设备丢失 device lost.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Direct3d 设备丢失 device lost.docx

1、Direct3d 设备丢失 device lostDirect3d 设备丢失 (device lost) 1.什么时候设备丢失 一个Direct3D设备, 有两种状态: 操作状态或丢失状态。操作状态: 是设备的正常状态, 设备按预期运行, 并且能present所有渲染效果丢失状态: 所有渲染操作悄然失败, IDirect3DDevice9:present返回错误码D3DERR_DEVICELOST 查帮助Lost Devices (Direct3D 9)看更详细介绍,用最民工的语言简略说说:什么时候设备会丢失?(1)全屏模式下当前Direct3D窗口丢失焦点时(2)有多个Direct3D窗口,

2、其中一个进入全屏则其它设备丢失(多显卡时情况则不同,每个显卡设备只有一个能全屏)系统休眠或者锁定(Win+L)(3)IDirect3DDevice9:Reset调用失败时, 设备也会被设置为丢失状态(4)重新设置Direct3D device 参数时 2.如何发现设备丢失 IDirect3DDevice9:present返回错误码D3DERR_DEVICELOST 或 D3DERR_DRIVERINTERNALERROR(这种情况下基本上要exit了)IDirect3DDevice9:TestCooperativeLevel返回错误码D3DERR_DEVICELOST或D3DERR_DRIVE

3、RINTERNALERROR(DX10整合到present中了) 不论通过任何方式发生了设备丢失,所有的操作几乎都会失效,只有Release()可以用其实D3D会保证有部分操作可以成功,但是也仅仅是“可以”成功而不是“一定”成功,所以你还不如认定丢失的时候全都会失败比较好以及IDirect3DDevice9:TestCooperativeLevel。因此在设备丢失之后,你应该停止整个游戏循环,而通过反复调用IDirect3DDevice9:TestCooperativeLevel判断设备是否可用。IDirect3DDevice9:TestCooperativeLevel这个方法检测当前的设备状

4、态。返回值有四种:D3D_OK一切正常,D3DERR_DEVICELOST设备丢失,D3DERR_DEVICENOTRESET设备可以Reset。另外还有D3D9新增的D3DERR_DRIVERINTERNALERROR,遇到这个你就完蛋了,基本不可能恢复了,终止程序吧。按照顺序来讲,如果游戏在正常运行,D3D_OK会返回;如果发生了设备丢失并且在这个时候不能恢复,比如全屏幕模式的时候用户切换到了Windows桌面,就会返回D3DERR_DEVICELOST;如果用户又切换回了游戏,设备可以恢复了(还没恢复呢!只是“可以”恢复而已),就会返回D3DERR_DEVICENOTRESET。另外,I

5、Direct3DDevice9:Present也会返回类似的值,不过你最好别指望这个,老老实实的用TestCooperativeLevel。因为Present在设备可以恢复的时候还是返回D3DERR_DEVICELOST(外一句:D3D10的时候TestCooperativeLevel就会完全整合到Present里面了,可喜可贺可喜可贺) 3.发现设备丢失后 1.查询设备状态, 看是否可以将之恢复到操作状态. 如果不行, 则必须要等到设备可以被恢复为止. 2.释放所有在D3DPOOL_DEFAULT中分配的资源, 包括用IDirect3DDevice9:CreateRenderTarget和I

6、Direct3DDevice9:CreateDepthStencilSurface方法创建的资源. (不进行这一步, 下一步的Reset操作会失败) 3.调用IDirect3DDevice:Reset进行恢复. Reset方法是当设备丢失时, 唯一有效的方法, 并且是应用程序可用来把设备从丢失状态恢复到操作状态的唯一方法. 4.重建在步骤2中释放的资源, 同时还需要重新设置state等 4.管理资源 1.资源管理是将资源从系统内存提升到设备可访问存储器及从设备可访问存储器中抛弃的过程 2.D3DPOOL_MANAGED标志指定一个由系统管理的资源。由系统管理的资源在设备的丢失状态和操作状态间的

7、转换中持续存在。通过调用IDirect3DDevice9:Reset设备可以被重置,并且这类资源可以继续正常运作而无需重新载入图片。但是,如果设备必须被销毁和重建,那么所有用D3DPOOL_MANAGED创建的资源也必须被重建 3.D3DPOOL_DEFAULT标志指定把资源放在默认的池中。在默认的池中的资源在设备从丢失状态到操作状态的转换过程中不持续存在,这些资源必须在调用Reset之前释放,然后重建 4.不是所有的类型和用途都支持资源管理。例如,用D3DUSAGE_RENDERTARGET标志创建的对象不支持资源管理。另外,不建议对需要频繁改变其内容的对象使用资源管理。例如,在某些硬件上对

8、一个每帧都需改变的顶点缓存进行自动管理会严重降低性能。但是,对纹理资源来说这不是一个问题 5.处理设备丢失 下面的伪代码:switch (IDirect3DDevice9:TestCooperativeLevel()case D3D_OK:GameLoop();break;case D3DERR_DEVICELOST:break;case D3DERR_DEVICENOTRESETOnLostDevice();IDirect3DDevice9:Reset();OnResetDevice();break;default:QuitGame();break;GameLoop()就是你的游戏运行的过程

9、了。把这个switch写在我们游戏框架的GameMain()部分,具体的位置可以看任何一话附带的源代码。 好像我一直没有讲IDirect3DDevice9:Reset的参数啊?因为只有一个参数,就是指向D3DPRESENT_PARAMS的指针。把你第一次创建设备时使用的D3DPRESENT_PARAMS结构保存起来,供Reset来用。OnLostDevice()就是Release掉所有D3DPOOL_DEFAULT的资源,OnResetDevice()就是Create*()恢复啦!你可能注意到ID3DXFont、ID3DXSprite等等都有同名的方法,就是在这个时候调用的。如果你没有这么做,

10、也就是说还保留着任何D3DPOOL_DEFAULT的资源的话,IDirect3DDevice9:Reset就一定会失败。 另外在OnResetDevice里面你还要重新进行SetRenderState、SetSamplerState等等,Reset之后这些东西也丢失了。实际上Reset和重新创建一次设备类似,所不同的是重新创建设备的话你需要连D3DPOOL_MANAGED的资源也Release掉。这个话题就不讨论了。从代码可以看出来,D3DERR_DEVICELOST时程序什么都没做,只是在傻等。我认为这是一个好习惯,因为实在不能保证在D3DERR_DEVICELOST时除了Release还能

11、干什么,与其这样还不如等设备能用了再说。 实在懒得管资源的话,全部D3DPOOL_MANAGED好了。至于渲染对象?自己想办法。 6.人工制造“设备丢失 “干嘛还要制造设备丢失啊?”如果更改游戏分辨率、色深、切换全屏幕及窗口状态,进行这样的操作也要通过Reset,同样的,Reset之前也要释放掉所有D3DPOOL_DEFAULT资源(其实严格来说,还有更多的资源也要释放,不过在2D下基本不会创建这类资源,你就不用管了)并且调用ID3DXSprite:OnLostDevice之类的方法。这就是人工制造“设备丢失”了。实际上在这个过程设备并没有真正的丢失,只是会有一段时间处于不可用的状态,此时Reset尚未返回,整个D3D设备就好像死了一样。举个例子,你切换桌面分辨率,会有那么一段时间显示器上什么都不显示,然后很快就正常了。和这个现象是同一个原因。Reset成功后记得恢复资源。你可能注意到这里的Reset和上面的Reset不是一回事。的确是这样,这里是为了重设状态而不是恢复设备。因此更改分辨率、色深的Reset需要写到switch外面,也就是别和它搅和的意思-_-bb。而且你只需要OnLostDevice -> Reset -> OnResetDevice。记住:正确的调用Reset不会造成设备丢失,这个概念别弄混了。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1