Device的Reset
来源:互联网 发布:java小游戏程序代码 编辑:程序博客网 时间:2024/06/06 07:26
(1)
(2)
(3)
(4)
都会发出WM_SIZE的信息,剩下的就看里怎么处理,当这里我还有一点想提的就是,那个SetWindowPos() 函数,它可以将窗口调整为指定的大小,但是你千万不要将它放入WM_SIZE的处理里面,不然它就进入一个死循环,因为你不断的调用SetWindowPos()会不断的发出WM_SIZE的消息。
好了,判断窗口大小的是否改变的问题解决了,但还不是我想说的主题。接下来就是最棘手的问题了,准备好了没?那我就当你准备好了!
第二步:如何改变后台缓存的大小?你或许会想将之前的Device设备全部释放掉,然后再创建一遍就行啦,这个方案是可行的,但是恭喜你,你浪费宝贵的资源与时间,还有浪费了微软老大辛辛苦苦想出来的Reset(),OnResetDevice()API函数,所以这个方案是不可用的,如果你还坚持你的想法是正确的话!那么好好想想,如果你的游戏要加载很多纹理,很多模型,你认为释放掉了再来创建,这样子得浪费多少的时间,如果有玩家玩你的游戏,肯定会破口而出,不就随便改下窗口嘛,用得着这么久吗!!!
所以我们得另寻方案,你也许会想到用Device的Reset(),没错,这个方案会比上面那个好几百倍,但你会用这个函数吗?那么先来看看这个API函数要求传入的参数。
HRESULT Reset(D3DPRESENT_PARAMETERS *pD3dpresent_Parameters)。
你会发现,它只需要一个D3DPRESENT_PARAMETERS结构体的指针,那么好办,我们填充这个结构体就行啦,你也许会像以下那样子填充:
然后你很高兴的会想到,当窗口改变的时候,就调用这个Reset(),将上面的结构体的指针传入做参数,你激动的想看看效果如何,然后点了运行,但你会发现会跳出一个错误,前提是你像下面那样使用:
判断一个函数是否运行成功是非常重要的,你也选择可以抛出一个异常而不用断言,但无论怎样,那个函数都不会调用成功。你很自然的就想到,肯定是上面的结构体填充错误了,但是错误在哪呢?我们只填充了我们想要的那部分,不要的全取默认值0了,错就错在了有些不该是0的,你却默认取了0。如果你加上下面两行:
你再运行,如果你其他地方没有错误而且没有用到需要在内存池创建的接口话,只是简简单单的调用pDevice的Clear、BeginSence()、EndSence()、Present(),当你改变了窗口,这个函数调用成功了,没有跳出错误信息了。
现在我们来想想是为什么?首先看下上面那两行说的是什么,意思一看就懂,开启自动深度模板缓存,并将格式设置为D3DFMT_D24X8,那么什么叫深度模板缓存,其实是两个概念。
(1)
(2)
到这里,终于松一口气了,那是不是说明问题就解决了呢?也许你注意到了上面我说的那句话“没有用到需要在内存池创建的接口”,什么是内存池?龙书有讲,去翻一下,简单的说就是放资源的地方,例如将文字Font放进显存,将点精灵sprite放进显存!
这时候问题就来了,如果你创建了Font、sprite之类的接口,当你改变了窗口,你什么也不管就调用pDevice的Reset(),你会发现,错误又跳出来了,因为你pDevice重设了显示模式,那些接口失效了,不过也很容易解决,在Reset之前先将它们OnLostDevice()掉,然后在pDevice->Reset()后再OnResetDevice()就可以了。
不过这里还有一个小技巧,将下面的改为0更好
d3dpp.BackBufferWidth =0;
不用担心,它不会真的是0,Direct3D会为我们自动设置为正确的值,不要注意的是,当你创建一个为800*600的窗口时,它真正显示图形的区域并没有这么多,而是784*562,剩下的一部分留给了窗口边框。如果将上面的设置为0,你再跟踪一下D3DPRESENT_PARAMETERS d3dpp的值,就会发现d3dpp.BackBufferWidth 和d3dpp.BackBufferHeight 的值其实不是800*600,而是784*562,不过这个只是在窗口模式才有效。如果是全屏模式,那可不是这么简单了,想了解的话看一下我另一篇文章。
- Device的Reset
- How to reset usb device in linux
- Device Tree Cleanup and Reset (Controller Renumbering)
- How to Reset USB Device in Linux
- ZigBee 3.0 《Base-Device-Behavior-Specification》-- Reset
- How to Reset USB Device in Linux–using libusb
- google verify your account this device was reset
- 经典的css reset代码 (reset.css)
- Connection Reset的错误
- CheckboxGroup的reset()方法
- reset的失效问题
- form表单的reset
- form表单的reset
- ActionForm的reset()方法
- css的reset
- git reset 的使用
- 关于css 的reset
- 淘宝的reset css
- Virtualbox运行CentOS报错:cannot access the kernel driver的解决
- 人脸造型与表演动画技术
- zoj3165二分图点权最大独立集+dinic匹配时的匹配数
- Codeforces 229B Planets 简单最短路
- DirectX3D的后台缓存分辨率
- Device的Reset
- Hadoop全分布平台搭建——小试牛刀
- UniDAC
- nslookup命令小结及附带DNS名词解释
- hdu 3400 Line belt(三分)
- 英语练习52 You're Sally,aren't you
- mfc类视图中view类消失的解决办法
- URL分析小结
- Struts2中关于filter的配置问题