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 ミリ秒かかります (1 秒間に複数回キャプチャする必要があるため、これは受け入れられません)。

BitBlt は、ビデオ ハードウェアからピクセル データを直接取得します。しかし、ビデオ カードは私のテスト マシン (つまり、Radeon 5470 と Radeon 4850) ではかなり優れているので、何が問題なのかわかりません。これらのカード (最近のカードはどれも) は 2D では 3D ほど優れていないことはわかっていますが、単純なブリット操作に 50 ミリ秒かかることはないと思います。

では、どうすればよいかアドバイスをお願いできますか?私の場合、あらゆる種類の「ハック」ソリューション(安定して動作している限り)で十分です。

ターゲット システムは Win7 x64、32 ビット コードです。

前もって感謝します!

4

1 に答える 1

0

Aeroが有効になっているBitBltのパフォーマンスは関連しています。また、エアロを無効にするWindowsの方法があります。私もエアロから15fps以上を取得するのに問題があります。変。

于 2012-04-16T18:26:56.467 に答える