5
我用下面的代码来捕捉屏幕与GDI函数:如何加速BitBlt捕捉屏幕与航空?
// Prologue:
int iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int iScreenHeight = GetSystemMetrics(SM_CYSCREEN);
HDC hScreenDC = GetDC(0);
HDC hCaptureDC = CreateCompatibleDC(hScreenDC);
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hScreenDC, iScreenWidth, iScreenHeight);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hCaptureDC, hCaptureBitmap);
// Capture:
BitBlt(hCaptureDC, 0, 0, iScreenWidth, iScreenHeight, hScreenDC, 0, 0, SRCCOPY);
// --- ... --- //
// Epilogue:
SelectObject(hCaptureDC, hOldBitmap);
DeleteObject(hCaptureBitmap);
DeleteDC(hCaptureDC);
ReleaseDC(0, hScreenDC);
的问题是:BitBlt函数是在航空被打开WAY慢 - 它需要近50毫秒(这是不能接受我,因为我需要在第二次捕获多次)。
BitBlt直接从视频硬件获取像素数据。但是在我的测试机器(即Radeon 5470和Radeon 4850)中,显卡非常好,所以我不明白什么是错的。我知道这些卡片(任何现代卡片)在3D方面都不是很好,但我认为这个简单的blit操作不应该花费50ms。
那么,你能请指教怎么办?任何一种“黑客”解决方案(只要它工作稳定)都可以做我的情况。
目标系统是Win7 x64,32位代码。
在此先感谢!
在Aero中,桌面是从所有顶层窗口的单个内存位图合成的。它支持实时窗口缩略图和Aero Peek等功能。这当然不是免费的,并且不会以任何方式硬件加速BitBlt。你真的应该打开CAPTUREBLT选项。我怀疑它有多大的不同。 –