小弟对DirectDraw了解很浅,现在要弄一个窗口模式的DirectDraw应用程序,本来一切都OK了,却突然发现一个巨大的BUG,那就是改变屏幕分辨率后一切黑屏。
我使用的方法是将所有图元存放在各个离屏表面中,然后在各个表面之间做Blt,最终显示出画面。
经过调试发现,当屏幕分辨率发生改变时,所有的表面都失效了,->Restore根本不起作用。
请教各位前辈,做DirectDraw窗口程序,一般采用什么来存放图元,是自定义的结构体还是DirectDraw表面,如果是前者又如何利用DirectDraw的高效性,如果是后者又如何避免表面的丢失呢?
另外附带一个问题,在两个离屏表面之间作Blt可以利用硬件特性么?
我使用的方法是将所有图元存放在各个离屏表面中,然后在各个表面之间做Blt,最终显示出画面。
经过调试发现,当屏幕分辨率发生改变时,所有的表面都失效了,->Restore根本不起作用。
请教各位前辈,做DirectDraw窗口程序,一般采用什么来存放图元,是自定义的结构体还是DirectDraw表面,如果是前者又如何利用DirectDraw的高效性,如果是后者又如何避免表面的丢失呢?
另外附带一个问题,在两个离屏表面之间作Blt可以利用硬件特性么?
解决方案 »
- 关于进程外服务器和死机的问题
- 怎么CListCtrl的某行某列中插入几个项。有人可以指点一下吗?
- dll中导出函数的问题。
- vc++6.0 ado 怎么调用access里面的查询呀
- 十万火急!关于用ADO连接后台数据库ORACLE的问题!在线等!谢谢!
- 概念问题:文档和视图
- 如何查询网络状态,比如网络流量等
- vc中成员变量的使用问题,例如创建edit控键的成员变量的类型为CEdit与CString的区别
- 求助!!
- 已知一堆GPS散点,如何求出GPS轮廓并得到这些点的坐标
- 向mysql插中文出现错误 "incorrect string value:\x....."
- 需要进行多字段模糊查询,请问为何字段一多,查出来就是空的?
后来多Lock几次,成功了,表面就可用了。
1、从1400x1050改变为1024x768时,Restore后,Blt还是失败,错误号887601C2(DDERR_INVALIDRECT)???
2、从1400x1050改变为1024x768时,再改变回1400x1050,Blt成功,返回DD_OK,但是画面花屏。2先不管,1肯定是要解决的,如果改变分辨后,DirectDraw就会失效,那岂不是只能把数据存在自定义结构体里面,需要的时候再创建一下表面了?
所以才来请教一下各位前辈一般是怎么处理这类应用的?
分配到系统内存可以防止表面丢失,不过这样就无法利用硬件的性能了。
想不通了!?DirectDraw要是只能这样,那岂不是很废?
一般来说这种情况都是把这些重新载入一次,可以看到很多游戏都是这样,在这种时候请观测指示灯,硬盘在读
那岂不是不能将中间产物常驻保存了???因为这东西没法简单复原啊!
我试过写一个Backup类备份图元数据,虽然可以工作,但是备份时要从显存读数据,而这速度实在不是人类可以忍受的。另外由于某些图片有alpha通道,我将所有离屏表面都设为32位,后来发现某些老式的显卡结合98系统,无法直接将32位表面Blt到16位的Primary表面。
如果通过GetDC结合GDI的方式写入倒是可以,不过却要涉及2次图形拷贝:
1、由于表面和DIB的图形存放顺序不同,所以需要生成一个HBITMAP作中间变量,这里是一次拷贝。
2、如果直接将1中的HBITMAP画到HDC上,会发现CLIPPER失效,比如让记事本在DirectDraw窗口上面移动,记事本无法覆盖住它的绘图;
所以需要再创建一个与Primary表面相同色深的中间表面过渡,最后还是利用Blt绘制,这里是二次拷贝。
这样的代价是不是大了一点?