小弟对DirectDraw了解很浅,现在要弄一个窗口模式的DirectDraw应用程序,本来一切都OK了,却突然发现一个巨大的BUG,那就是改变屏幕分辨率后一切黑屏。
我使用的方法是将所有图元存放在各个离屏表面中,然后在各个表面之间做Blt,最终显示出画面。
经过调试发现,当屏幕分辨率发生改变时,所有的表面都失效了,->Restore根本不起作用。
请教各位前辈,做DirectDraw窗口程序,一般采用什么来存放图元,是自定义的结构体还是DirectDraw表面,如果是前者又如何利用DirectDraw的高效性,如果是后者又如何避免表面的丢失呢?
另外附带一个问题,在两个离屏表面之间作Blt可以利用硬件特性么?

解决方案 »

  1.   

    我的DIRECTDRAWSURFACE在按下“Ctrl+Alt+Del”调出系统登录界面后也会丢失,并且用Restore也不能恢复。
    后来多Lock几次,成功了,表面就可用了。
      

  2.   

    从1400x1050改变为1024x768时(未改变色深),所有表面都失效了(包括离屏表面),症状是Blt失败,Lock也失败。
      

  3.   

    我再把症状描述的详细一点吧:
    1、从1400x1050改变为1024x768时,Restore后,Blt还是失败,错误号887601C2(DDERR_INVALIDRECT)???
    2、从1400x1050改变为1024x768时,再改变回1400x1050,Blt成功,返回DD_OK,但是画面花屏。2先不管,1肯定是要解决的,如果改变分辨后,DirectDraw就会失效,那岂不是只能把数据存在自定义结构体里面,需要的时候再创建一下表面了?
    所以才来请教一下各位前辈一般是怎么处理这类应用的?
      

  4.   

    我也碰到了同样的问题,改变分辨率,离屏页面lock失败,返回0x887601c2,盼高手指点!
      

  5.   


    分配到系统内存可以防止表面丢失,不过这样就无法利用硬件的性能了。
    想不通了!?DirectDraw要是只能这样,那岂不是很废?
      

  6.   

    就是这么设计的,现在连restore都成了专门的学问.
    一般来说这种情况都是把这些重新载入一次,可以看到很多游戏都是这样,在这种时候请观测指示灯,硬盘在读
      

  7.   


    那岂不是不能将中间产物常驻保存了???因为这东西没法简单复原啊!
    我试过写一个Backup类备份图元数据,虽然可以工作,但是备份时要从显存读数据,而这速度实在不是人类可以忍受的。另外由于某些图片有alpha通道,我将所有离屏表面都设为32位,后来发现某些老式的显卡结合98系统,无法直接将32位表面Blt到16位的Primary表面。
    如果通过GetDC结合GDI的方式写入倒是可以,不过却要涉及2次图形拷贝:
    1、由于表面和DIB的图形存放顺序不同,所以需要生成一个HBITMAP作中间变量,这里是一次拷贝。
    2、如果直接将1中的HBITMAP画到HDC上,会发现CLIPPER失效,比如让记事本在DirectDraw窗口上面移动,记事本无法覆盖住它的绘图;
       所以需要再创建一个与Primary表面相同色深的中间表面过渡,最后还是利用Blt绘制,这里是二次拷贝。
    这样的代价是不是大了一点?