2011-08-12 37 views
5

Używam następujący kod do przechwytywania ekranu z funkcjami GDI:Jak przyspieszyć BitBlt do przechwytywania ekranu za pomocą aero?

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

Problemem jest to: funkcja BitBlt jest WAY spowolnić kiedy Aero jest włączona - trwa prawie 50 milisekund (co jest nie do przyjęcia dla mnie, bo Muszę przechwycić wiele razy w drugim).

BitBlt pobiera dane pikseli bezpośrednio ze sprzętu wideo. Ale karty graficzne są całkiem dobre w moich maszynach testowych (mianowicie Radeon 5470 i Radeon 4850), więc nie rozumiem, co jest nie tak. Wiem, że te karty (jakiekolwiek współczesne karty) nie są tak dobre w 2D, jak w 3D, ale ta prosta operacja blitu nie powinna w żadnym wypadku zająć 50 ms.

Czy możesz więc doradzić, co robić? Jakiekolwiek "hackowe" rozwiązanie (o ile działa stabilnie) byłoby w moim przypadku.

System docelowy to Win7 x64, 32-bitowy kod.

Z góry dziękuję!

+1

W środowisku Aero pulpit jest połączony z indywidualnymi mapami bitowymi wszystkich dostępnych okien dwupoziomowych. Umożliwia korzystanie z funkcji takich jak miniatury okien na żywo i Aero Peek. To oczywiście nie przychodzi za darmo i nie będzie w żaden sposób przyspieszane sprzętowo dla BitBlt. Naprawdę powinieneś włączyć opcję CAPTUREBLT. Wątpię, że to robi dużą różnicę. –

Odpowiedz