D3D的设备丢失处理经验
在D3D图形编程中,你是不是遇到过吃完饭回来,就发现先前运行的DEMO无情地被DOWN掉了的情况。是否遇到过,在DEMO运行过程中,修改了屏幕分辨率,DEMO就DOWN掉了的情况? 这就是传说中的D3D设备丢失。 下面是一些简单的总结。
1.什么时候会设备丢失?
全屏/窗口模式的切换、屏幕锁、修改屏幕分辨率等。上面的这些行为会使D3D设备重置显卡状态以及刷新相应的缓冲区,所以会导致设备的丢失。另外,如果你需要重建后台缓冲区。则同样应该按设备丢失的方法来处理和重新加载你的资源。
2.哪些资源会影响设备丢失?
在创建D3D资源时,可以选择自己管理D3D资源还是让D3D帮你管理资源,前者需要在设备丢失时手动重新载入;后者就不需要。对于使用D3DPOOL_DEFAULT时为自己管理资源,D3DPOOL_MANAGED为D3D管理资源。对于D3DXMESH使用D3DXMESH_SYSTEMMEM因放在系统内存,所以不会存在设备丢失的问题.对于这个问题,你可参见本BLOG中的《D3DPOOL》一文。
3.处理设备丢失的顺序
(1)卸载位于显存的自己管理的D3D资源(D3DPOOL_DEFAULT)和调用一些D3DX资源的OnLostDevice函数,如ISPRITE,ID3DXFONT
(2)按照创建设备时的方法填充D3DPRESENT_PARAMETERS,并使用设备Reset
(3)重新载入设备和调用一些D3DX资源的OnResetDevice函数
(4)重新设置矩阵和初始渲染状态
上面这个是一般方法。对于其中要进行的一些特殊处理,则视个人情况而定!!
另外,当你需要重置资源,但设备又不处于丢失状态的时候。可以强制调用Reset。此时的Reset是不成功的,但他可以导致设备丢失,这样就把要做的工作转交给了处理设备丢失的函数!
作者:麒麟子
出处:http://www.cnblogs.com/qilinzi/
蛮牛专栏:麒麟子
简介:麒麟子,编程15年,科技创始人,技术作家。
09年进入游戏行业,16年创立成都幼麟科技有限公司。十年从业经验练就了游戏全栈技能,目前专注于手机游戏领域。
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。