C++ 捕获位图快速内存

C++ 捕获位图快速内存,c++,bitmap,C++,Bitmap,这段代码正在以每秒1%到2%(总共6GB)的速度消耗我的RAM。 谁能告诉我怎么了?提前谢谢。我是新手,所以如果我听起来像个十足的白痴,我就是。我想尽快得到答复 #include <windows.h> #include <iostream> #include <stdio.h> using namespace std; /* Globals */ int ScreenX = 0; int S

这段代码正在以每秒1%到2%(总共6GB)的速度消耗我的RAM。 谁能告诉我怎么了?提前谢谢。我是新手,所以如果我听起来像个十足的白痴,我就是。我想尽快得到答复

        #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;
    }
#包括
#包括
#包括
使用名称空间std;
/*全球的*/
int ScreenX=0;
int-ScreenY=0;
字节*屏幕数据=0;
无效屏幕盖()
{
HDC hsscreen=GetDC(GetDesktopWindow());
//hs屏幕2=hs屏幕;
如果(屏幕X==0)
{
ScreenX=GetDeviceCaps(hsScreen,HORZRES);
ScreenY=获取设备CAPS(hs屏幕,垂直);
}
HDC hdcMem=CreateCompatibleDC(hs屏幕);
HBITMAP HBITMAP=CreateCompatibleBitmap(hsscreen,ScreenX,ScreenY);
HGDIOBJ hOld=SelectObject(hdcMem、hBitmap);
BitBlt(hdcMem,0,0,ScreenX,ScreenY,hsscreen,0,0,srcopy);
选择对象(hdcMem,按住);
BitMapInfo标头bmi={0};
bmi.biSize=sizeof(BitMapInfo标头);
bmi.biPlanes=1;
bmi.biBitCount=32;
bmi.biWidth=ScreenX;
bmi.biHeight=-筛状;
bmi.biCompression=biu RGB;
bmi.biSizeImage=0;//3*ScreenX*ScreenY;
if(屏幕数据)
免费(屏幕数据);
ScreenData=(字节*)malloc(4*ScreenX*ScreenY);
GetDIBits(hdcMem、hBitmap、0、ScreenY、ScreenData(BITMAPINFO*)和bmi、DIB_RGB_颜色);
释放DC(GetDesktopWindow(),hs屏幕);
DeleteDC(hdcMem);
}
内联整数PosB(整数x,整数y)
{
返回屏幕数据[4*((y*ScreenX)+x)];
}
内联整数PosG(整数x,整数y)
{
返回屏幕数据[4*((y*ScreenX)+x)+1];
}
内联整数PosR(整数x,整数y)
{
返回屏幕数据[4*((y*ScreenX)+x)+2];
}
bool按钮按下(int键)
{
按下布尔按钮=错误;
while(GetAsyncKeyState(键))
按下按钮=真;
按下返回按钮;
}
int main()
{
while(true)
{
屏幕盖();
/*对于(int x=1;x您是否可以继续创建新位图,而从不删除它们

比每次释放位图更好的方法是重用以前的位图,除非屏幕大小实际发生了更改。
ScreenData
。不必要的重新分配是性能杀手


在销毁DC之前,您也没有选择原始对象,这是一个问题。

那么我该如何删除它们呢?就像我说的,我是个白痴。我不想问,但这是我的最后一个问题(我希望)。你能发布一个修改后的版本吗?我希望要求不要太高。
CreateCompatibleBitmap
的文档应该会指向
DeleteObject
,这是位图删除功能。MSDN上没有示例吗?