最近在使用directdraw来画高清格式的大图片,由于之前没有用过directdraw,所以对其用法也不甚了解。根据directdraw流程来画图。初始化,创建directdraw对象,设定控制级,创建主表面,创建离屏表面,GetDC()得到DC,然后将pData数据拷贝到离屏DC上,完了之后就ReleaseDC()释放离屏DC,将离屏图案blt到主表面,最后释放所有对象和表面。
       可能是内存占用比较多,在线程中调用该绘制函数,几秒钟以后内存就急剧增加,直至崩溃。查看后也没有怎么发现内存泄露,使用的是内存池。 
       网络上说可能是DC没有释放,可是我已经ReleaseDC了。离屏表面的返回值也是正确的,说明释放完毕。
       现在一直没有好的办法,如果有经历过directdraw的朋友,可以告诉我该怎么搞,先谢了。

解决方案 »

  1.   

    相信你操作DC应该没问题
    可能是directdraw里面的对象没释放干净
      

  2.   

         首先感谢你能回复,多谢了.
         我是定义的几个全局directdraw对象,在进入类对象里面初始化一次,然后出去的时候解析。然后在类中实现画图函数。
          我也试过在一个函数中实现初始化到画图再释放的全过程,但是问题依然存在。
          
          回复有分,希望大家能帮忙
      

  3.   

    哦,对了,我是获取屏幕的句柄GetDesktopWindow(),来进行设定控制级的第一个参数。
          也用的临界区来进行线程控制。但效果不明显。
      

  4.   

    好像没有.图片是采用链式队列push以后,然后得到front,用完以后就pop。
         另外,我屏蔽画图函数以后内存也不会激增。
         DisplayBitmap(&BitmapInfo,BmpData,rect,m_nCurrentChannelId);这个是我写的绘图函数,bmpdata为位图数据。rect为绘制图片的目的区域。在函数里面可能还会进行调整,比如在整个区域里面进行分隔显示,4*4或者9*9等,根据m_nCurrentChannelID来判断。   
         我刚才想了一下,是不是每次离屏表面创建的nWidth,&nHeight都是1920*1080,显示区域只有300*256左右,是不是创建太大的缘故呢,我屏幕分辨率为1366*768。
      

  5.   

          why ...
      

  6.   

    你的离屏DC是用GetDC得的DC作为参数创建的吧?离屏DC的释放要用DeleteDC,ReleaseDC不行。
      

  7.   

    你的离屏DC是用GetDC得的DC作为参数创建的吧?离屏DC的释放要用DeleteDC,ReleaseDC不行。 大哥,你试过没有呀,有DeleteDC吗?
      

  8.   

    请问你怎么解决的,我也是遇到这问题,我的是lock 和unlock问题。