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是屏幕宽度的两倍左右,这个情况下你把位深度调低,很大可能画面就正常的,原因就是显卡不支持问题。
- DirectDraw双缓冲技术,一个小问题。
- 双缓冲技术 directdraw
- 对双缓冲技术提个问题。
- 双缓冲技术
- 双缓冲技术
- gdi+ 双缓冲技术
- C#双缓冲技术
- J2ME双缓冲技术
- Java双缓冲技术
- 双缓冲技术
- Android双缓冲技术
- J2ME双缓冲技术
- Java双缓冲技术
- 双缓冲技术
- 双缓冲技术绘图
- 双缓冲技术
- 双缓冲技术绘图
- 双缓冲技术绘图
- C++ string之unique(),erase(),sort()使用小记
- 如何从Eclipse导入github上的项目源码
- 2014年最热门的国人开发开源软件TOP100
- Ogre+Code::Block配置
- DirectDraw学习:第一课
- DirectDraw双缓冲技术,一个小问题。
- 双向链表的插入算法
- DirectDraw创建窗口程序的注意事项
- DirectDraw关于blt的一些注意事项
- 搜索二叉树的实现
- Boost之内存池学习
- VC下加载JPG/GIF/PNG图片的两种方法(转)
- CButtonST详细介绍
- CEPH可靠性的计算方法分析