我正在使用while循环来执行某些算法而不是,但它不是很快,我怎么能让我的程序使用更多的RAM? (我假设它是限制它的)它目前稳定在504kB。
我正在使用
如果之前已经问过并回答了这个问题,我很抱歉,但如果有问题,我似乎无法找到它。
编辑:那么这将扫描100个像素,是什么导致这需要2.2秒?
#include <windows.h>
#include <iostream>
#include <wingdi.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
void scan(HDC dc, int x, int y, int &r, int &g, int &b) {
COLORREF color = GetPixel(dc, x, y);
r = GetRValue(color);
g = GetGValue(color);
b = GetBValue(color);
}
int main() {
HDC dc = GetDC(NULL);
int r,g,b;
for(int i = 0; i < 100; i++) {
scan(dc,100,100 + i,r,g,b);
}
ReleaseDC(NULL, dc);
return 0;
}
2:编辑:是否可以在不编辑代码的情况下缩短这段时间?我的意思是,它必须受我的RAM或我的CPU限制吗?
答案 0 :(得分:3)
您的程序不仅限于少量内存。由于它最有可能被编译为32位应用程序,因此默认情况下它最多可以分配2 GB的ram。
所以,不,内存很可能不是你的问题,除非你经常请求并再次释放它(但即便如此,它仍然取决于你的代码)。
如果您的程序太慢,您可能可以使用并行化来加快处理速度,但这又取决于您的实际代码。
您也可以使用模板和instanziation在编译时优化算法,但又不知道代码......没有。
自编辑以来:
瓶颈是 - 正如已经提到的 - 重复调用GetPixel()
本身相当昂贵,因为有些工作要做,而不是缓存等。
相反,您应该将窗口内容复制到您自己的内存区域并直接读取像素(以字节为单位)。
您可以关注this MSDN example。他们将位图内容/像素写入文件,但您基本上也想要这样做,只需直接读取该数据。只需查看变量lpbitmap
的使用即可找到相关的行。
简而言之,您需要使用BitBlt()
为位图创建屏幕截图,然后使用GetDIBits()
复制这些像素:
// memory dc for the window
hdcMemDC = CreateCompatibleDC(hdcWindow);
// bitmap for the screenshot
hbmScreen = CreateCompatibleBitmap(hdcWindow, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top);
// connect both
SelectObject(hdcMemDC,hbmScreen);
// copy the window contents
BitBlt(hdcMemDC, 0,0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, hdcWindow, 0, 0, SRCCOPY);
// get the bitmap object
GetObject(hbmScreen, sizeof(BITMAP), &bmpScreen);
// access the bitmap
HANDLE hDIB = GlobalAlloc(GHND,dwBmpSize);
// lock the bitmap
char *lpbitmap = (char *)GlobalLock(hDIB);
// copy the pixel data
GetDIBits(hdcWindow, hbmScreen, 0, (UINT)bmpScreen.bmHeight, lpbitmap, (BITMAPINFO *)&bi, DIB_RGB_COLORS);
// now access lpbitmap inside your loop and later on clean up everything
答案 1 :(得分:1)
问题在于GetPixel。这是一个非常慢的API。另一种方法是将屏幕复制到内存缓冲区,然后访问内存缓冲区。