Screen Capture i duże obciążenie procesora

0

Witam, piszę program(w zasadzie to bot), który pobiera zrzut całego ekranu, skanuje jego część pixel po pixelu oraz klika myszką i wpisuje znaki z klawiatury. Problem jest taki, że po kilku minutach działania programu komputer zaczyna spowalniać, zwłaszcza aplikacja, na której są wywoływane te akcje(głównie gimp). Użycie procesora przez tego bota wynosi około 50-60%, pamięci ram około 1MB.
Korzystam z biblioteki WinAPI, kolejne zrzuty ekranu są wykonywane po zrobieniu i przeskanowaniu poprzedniego zrzutu.
Kod robiący zrzut ekranu:

 
HBITMAP hBitmap = NULL;
HDC hDesktopdc, hBitmapdc;
HBITMAP hOriginal;
hDesktopdc = GetWindowDC( HWND_DESKTOP );
...
nWid = 656; // szerokość i wysokość skanowanego obszaru
nHt = 460; 
hBitmap = CreateCompatibleBitmap( hDesktopdc, nWid, nHt );
hBitmapdc = CreateCompatibleDC( hDesktopdc );
hOriginal =( HBITMAP ) SelectBitmap( hBitmapdc, hBitmap );
BitBlt( hBitmapdc, 0, 0, nWid, nHt, hDesktopdc, nlPx, nlPy, SRCCOPY );

Przy skanowaniu bitmapy korzystam z getpixel, po wykonaniu każdego zrzutu ekranu czyszczę uchwyty.
Symulację przycisków wykonuję za pomocą sendinput, natomiast kliknięcia myszą za pomocą setCursorPos oraz mouse_event.
Całe pobranie zrzutu ekranu, jego skanowanie oraz operacje na klawiaturze i myszce wykonywane są w jednym osobnym wątku.

Macie jakieś sugestie w jaki sposób mógłbym zoptymalizować ten program?

Dodam, że program nie jest pisany aby w jakikolwiek sposób zaszkodzić innym osobom, nie jest to żaden spambot ani nic podobnego. Uczę się w Technikum Informatycznym i piszę ten program na ocenę celującą. Program wykonuje akcje na GIMP'ie oraz obiekcie flash w przeglądarce(skanowanie obrazu oraz kilka szybkich kliknięć).

Pozdrawiam i z góry dziękuję za pomoc :)

PS. Jeszcze odnośnie tego problemu z zamulaniem komputera. Wydaje mi się, że gdy fizycznie poruszę myszką gdy program wciąż pracuje to komputer lekko się "odmula".

0

zamień GetPixel na ScanLine

0

A gdyby tak zastosować robienie zrzutu i jego skanowanie w DirectX? Podobno jest to dużo szybsze.
Co wy na to? Tylko jestem ciekawy czy jest jakaś gotowa funkcja do odczytywania kolorów z Surface, póki co jej nie znalazłem.

#edit
Zrobiłem to wszystko w directx, jak na razie wszystko działa, tylko mam jeszcze jeden problem.
Gdy przeszukuję cały obraz to nie ma problemu, wykorzystuję taką pętlę:

for(int y=0; y<game.bottom-game.top; y++) {
            DWORD * row = (DWORD *)((char *)lockedRect.pBits + lockedRect.Pitch * y);
            for(int x=0; x<game.right-game.left; x++) {
                //row[x] = 0xffff0000;
            }
        } 

Lecz problem pojawia się gdy chcę odczytać i zmienić kolor jednego piksela poza pętlą. Próbuję na różne sposoby ale wciąż nie działa ;/
Wiecie może jak mógłbym odczytać i nadpisać jeden kolor o danych współrzędnych?

#edit2
Problem rozwiązany, zrobiłem to w taki sposób:

((DWORD*)(((BYTE*)lockedRect.pBits)+Y*lockedRect.Pitch))[X] = 0xffff0000;

Temat do zamknięcia :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1