DirectDraw双缓冲技术,一个小问题。

来源:互联网 发布:c语言能做界面吗 编辑:程序博客网 时间:2024/05/16 11:43

        学习DirectDraw的过程中,遇到了一个小问题,而且还让我花了很久时间去想原因, 下面直接上代码。

#define SCREEN_WIDTH 1024
#define SCREEN_HEIGHT 768
#define SCREEN_BPP  8   //在我的机子上必须是8,要不画面会很怪。

         if (DirectDrawCreateEx(NULL,(void**)&lpDD,IID_IDirectDraw7,NULL)!= DD_OK)
 {
  return FALSE;
 }
 if (lpDD->SetCooperativeLevel(GetActiveWindow(),DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_ALLOWREBOOT) != DD_OK)
 {
  return FALSE;
 }
 if (lpDD->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0) != DD_OK)
 {
  MessageBox(GetActiveWindow(),"DisplayMode","Error",MB_OK);
  return false;
 }
 //initialize ddsurface description. initialize lpddprimary
 memset(&ddsd,0,sizeof(ddsd));
 ddsd.dwSize=sizeof(ddsd);
 ddsd.dwFlags=DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
 ddsd.dwBackBufferCount=1;
 ddsd.dwWidth=SCREEN_WIDTH;
 ddsd.dwHeight=SCREEN_HEIGHT;
 ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;

 if(lpDD->CreateSurface(&ddsd,&lpDDPrimary,NULL) != DD_OK) return false;
 //initialize ddbuffer surface
 ddsd.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER;
 
 if (FAILED(lpDDPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDBuffer))) return FALSE;

以上是初始化的一些东西,懒得说,其实看函数名字就知道函数是搞撒的咯。

if(lpDDPrimary != NULL)
   {
    if(lpDDBuffer!=NULL)
    { 
     DDRAW_INIT_STRUCT(ddsd);
     lpDDBuffer->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR| DDLOCK_WAIT, NULL);
   
     // get lpddBuffer memory.
     UCHAR *back_buffer=(UCHAR *)ddsd.lpSurface;
     
     //create folder
     CreateDirectory("Log", NULL);
     
     fstream file("Log/data.log",ios::out | ios::app | ios::in);
     file<<ddsd.dwWidth<<"x"<<ddsd.dwHeight<<"x"<<SCREEN_BPP<<"  "<<ddsd.lPitch<<endl;
     file.close();

     // initialize lpddbuffer memory. all of 0.
     //ddsd.lPitch is
     if (ddsd.lPitch == SCREEN_WIDTH)
     {
      memset(back_buffer,0,SCREEN_WIDTH * SCREEN_HEIGHT);
     }
     else
     {
      UCHAR *dest_Ptr=back_buffer;
      for (int y=0;y<SCREEN_HEIGHT;y++)
      {
       memset(dest_Ptr,RGB(0,0,0),SCREEN_WIDTH); 
       dest_Ptr+=ddsd.lPitch;
      }
     }
  
     for (int index=0;index<5000;++index)
     {
      int x=rand()%SCREEN_WIDTH;
      int y=rand()%SCREEN_HEIGHT;
      int rColr=rand()%256;
      int gColr=rand()%256;
      int bColr=rand()%256;
      back_buffer[x+y*ddsd.lPitch] = RGB(rColr,gColr,bColr);
     }
     
     if (FAILED(lpDDBuffer->Unlock(NULL)))
     {
      return 0;
     }   
    }
    while(FAILED(lpDDPrimary->Flip(0,DDFLIP_WAIT)));

 

  这一段代码看起来也是没问题的。其实也没问题。 不过有一个隐含的问题。 当你坚持lPtich不等于屏幕宽度时,就有可能发生,也许是我的显卡太老咯。  如果你发现你绘制的屏幕画面只绘制了一部分的时候 就要看看是不是这个问题了。 显卡不支持8位深度以上。

  一般情况下是lPtich是屏幕宽度的两倍左右,这个情况下你把位深度调低,很大可能画面就正常的,原因就是显卡不支持问题。

0 0
原创粉丝点击