100分询问使用directdraw渲染yv12视频,如果有半透明窗口遮在显示画面上,会闪烁。但是锁屏,然后回来之后正常显示,请问原因。
主要是想知道闪烁的原因。谢谢。
创建主表面
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY;
if (lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL) != DD_OK)
{
return FALSE;
}
创建离屏表面
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_OVERLAY;
ddsd.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT|DDSD_HEIGHT | DDSD_WIDTH ;
ddsd.dwWidth = WND_DWIDTH;
ddsd.dwHeight = WND_DHEIGHT;
ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC | DDPF_YUV ;
ddsd.ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y','V','1','2');
ddsd.ddpfPixelFormat.dwYUVBitCount = 12;
if (lpDD->CreateSurface(&ddsd, &lpDDSOffScr, NULL) != DD_OK)
blt视频
do {
ddRval = lpDDSOffScr->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_WRITEONLY,NULL);
} while(ddRval == DDERR_WASSTILLDRAWING);
//填充表面...
lpDDSOffScr->Unlock(NULL);
ddRval = lpDDSPrimary->Blt(&tmpDest, lpDDSOffScr, &rctSour, DDBLT_WAIT, NULL);
基本过程就是这样的,谢谢大家了!