2013-12-15 80 views
0

此代碼以1%到2%(每秒總共6 GB)的速度吞噬我的內存。 誰能告訴我什麼是錯的?提前致謝。我是新手,所以如果我聽起來像一個完全白癡,我是。我想快速回答。捕獲位圖快速進食內存

 #include <windows.h> 
    #include <iostream> 
    #include <stdio.h> 

    using namespace std; 

    /* Globals */ 
    int ScreenX = 0; 
    int ScreenY = 0; 
    BYTE* ScreenData = 0; 

    void ScreenCap() 
    { 
     HDC hScreen = GetDC(GetDesktopWindow()); 
     //hScreen2 = hScreen; 

     if (ScreenX == 0) 
     { 
      ScreenX = GetDeviceCaps(hScreen, HORZRES); 
      ScreenY = GetDeviceCaps(hScreen, VERTRES); 
     } 

     HDC hdcMem = CreateCompatibleDC (hScreen); 
     HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, ScreenX, ScreenY); 
     HGDIOBJ hOld = SelectObject(hdcMem, hBitmap); 
     BitBlt(hdcMem, 0, 0, ScreenX, ScreenY, hScreen, 0, 0, SRCCOPY); 
     SelectObject(hdcMem, hOld); 

     BITMAPINFOHEADER bmi = {0}; 
     bmi.biSize = sizeof(BITMAPINFOHEADER); 
     bmi.biPlanes = 1; 
     bmi.biBitCount = 32; 
     bmi.biWidth = ScreenX; 
     bmi.biHeight = -ScreenY; 
     bmi.biCompression = BI_RGB; 
     bmi.biSizeImage = 0;// 3 * ScreenX * ScreenY; 

     if(ScreenData) 
      free(ScreenData); 
     ScreenData = (BYTE*)malloc(4 * ScreenX * ScreenY); 

     GetDIBits(hdcMem, hBitmap, 0, ScreenY, ScreenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS); 

     ReleaseDC(GetDesktopWindow(),hScreen); 
     DeleteDC(hdcMem); 
    } 

    inline int PosB(int x, int y) 
    { 
     return ScreenData[4*((y*ScreenX)+x)]; 
    } 

    inline int PosG(int x, int y) 
    { 
     return ScreenData[4*((y*ScreenX)+x)+1]; 
    } 

    inline int PosR(int x, int y) 
    { 
     return ScreenData[4*((y*ScreenX)+x)+2]; 
    } 

    bool ButtonPress(int Key) 
    { 
     bool button_pressed = false; 

     while(GetAsyncKeyState(Key)) 
      button_pressed = true; 

     return button_pressed; 
    } 

    int main() 
    { 
     while (true) 
     { 
      ScreenCap(); 

      /*for (int x = 1; x < ScreenX; x++) 
      { 
       for (int y = 1; y < ScreenY; y++) 
       { 
        int Red = PosR(x, y); 
        int Green = PosG(x, y); 
        int Blue = PosB(x, y); 

        if (Red == 22 && Green == 58 && Blue == 89) 
        { 
         cout << ">:D"; 
         POINT pos; 
         GetCursorPos(&pos); 

         int DX = 683 - x; 
         int DY = 683 - y; 

         /*COLORREF col = GetPixel(hScreen2, DX - pos.x + 1, pos.y - DY + 1); 

         int red = GetRValue(col); 
         int blue = GetBValue(col); 
         int green = GetGValue(col); 

         if (red == 22 && green == 58 && blue == 89) 
         { 
          break; 
         } 

         //SetCursorPos(x + DX, y + DY); 
         SetCursorPos(DX - pos.x + 1, pos.y - DY + 1); 
         cout << DX - pos.x << ", " << pos.y - DY + 1 << endl; 
         break; 
        } 
       } 
      }*/ 
     } 

     system("PAUSE"); 
     return 0; 
    } 

回答

2

您一直在創建新的位圖並且從不刪除它們。

即使每次釋放它們都會重用先前的位圖,除非屏幕大小實際發生了變化。同上ScreenData。不必要的重新分配是性能殺手。

在破壞DC之前,您還沒有選擇原始對象,這是一個問題。

+0

那麼我會如何刪除它們?就像我說的,我是個白癡。 – user3103398

+0

我討厭問,但這是我最後的問題(我希望)。你可以發佈修改後的版本嗎?我希望沒有太多要求。 – user3103398

+0

'CreateCompatibleBitmap'的文檔應該指向'DeleteObject',它是位圖刪除功能。 MSDN上沒有示例嗎? –