如何加快 BitBlt 以使用 aero 捕获屏幕?

Posted

技术标签:

【中文标题】如何加快 BitBlt 以使用 aero 捕获屏幕?【英文标题】:How to speed up BitBlt to capture screen with aero? 【发布时间】:2011-10-26 00:39:53 【问题描述】:

我使用以下代码通过 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 功能WAY很慢 - 大约需要 50 毫秒(这对我来说是不可接受的,因为我需要在一秒钟内捕获多次)。

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

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

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

提前致谢!

【问题讨论】:

在 Aero 中,桌面由所有顶层窗口的单独内存位图合成。它支持实时窗口缩略图和 Aero Peek 等功能。这当然不是免费的,也不会以任何方式为 BitBlt 提供硬件加速。你真的应该打开 CAPTUREBLT 选项。我怀疑这有什么不同。 【参考方案1】:

BitBlt performance with Aero enabled 是相关的。 还有一种 windows 方法可以禁用 aero。我也一直在从航空中获得超过 15 fps 的问题。很奇怪。

【讨论】:

以上是关于如何加快 BitBlt 以使用 aero 捕获屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

BitBlt 无法正确捕获标题栏

BitBlt 屏幕截图在 Windows 10 上不起作用

隐藏窗口的 PrintWindow 和 BitBlt

BitBlt 转换为字节数组并从 c++ 解析为 c#

捕获窗口的屏幕截图,不包括某些 HWND 的样式 (WS_SYSMENU)

如何让 tesseract-ocr 从屏幕上的坐标读取?