Как ускорить BitBlt для захвата экрана с аэро? - PullRequest
5 голосов
/ 12 августа 2011

Я использую следующий код для захвата экрана с функциями 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);

Проблема в том, что функция BitBlt WAY медленная, когда Aero включен - это занимает почти 50 миллисекунд (что для меня неприемлемо, потому что мне нужно захватывать несколько раз в секунду).

BitBlt получает данные пикселей непосредственно с видеооборудования. Но видеокарты довольно хороши в моих тестовых машинах (а именно Radeon 5470 и Radeon 4850), поэтому я не понимаю, в чем дело. Я знаю, что эти карты (любые современные карты) не так хороши в 2D, как в 3D, но эта простая операция блитов в любом случае не должна занимать 50 мс.

Итак, не могли бы вы посоветовать, что делать? Любое «хакерское» решение (если оно стабильно работает) подойдет в моем случае.

Целевой системой является Win7 x64, 32-битный код.

Заранее спасибо!

1 Ответ

0 голосов
/ 16 апреля 2012

Производительность BitBlt с включенным Aero связана. Также есть способ Windows, чтобы отключить аэро. У меня тоже были проблемы с получением более 15 кадров в секунду из аэро. Weird.

...