2011-08-12 26 views
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位代码。

在此先感谢!

+1

在Aero中,桌面是从所有顶层窗口的单个内存位图合成的。它支持实时窗口缩略图和Aero Peek等功能。这当然不是免费的,并且不会以任何方式硬件加速BitBlt。你真的应该打开CAPTUREBLT选项。我怀疑它有多大的不同。 –

回答