5

我使用以下代码通过 GDI 函数捕获屏幕:

// 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);

问题是:当 Aero 打开时, BitBlt功能非常慢 - 它需要将近 50 毫秒(这对我来说是不可接受的,因为我需要在一秒钟内捕获多次)。

BitBlt 直接从视频硬件获取像素数据。但是显卡在我的测试机器(即 Radeon 5470 和 Radeon 4850)中相当不错,所以我不明白哪里出了问题。我知道这些卡片(任何现代卡片)在 2D 中不如在 3D 中那么好,但我认为简单的 blit 操作不应该花费 50 毫秒。

所以,你能建议怎么做吗?在我的情况下,任何类型的“hackish”解决方案(只要它可以稳定工作)都可以。

目标系统是 Win7 x64,32 位代码。

提前致谢!

4

1 回答 1

0

启用 Aero 的 BitBlt 性能是相关的。还有一种 windows 方法可以禁用 aero。我也一直在从航空中获得超过 15 fps 的问题。诡异的。

于 2012-04-16T18:26:56.467 回答