如何加快 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 捕获屏幕?的主要内容,如果未能解决你的问题,请参考以下文章