我正在写一个计算图像每个像素的rgb值的小东西。
我想在计算后显示每一个。 问题是我无法弄清楚如何快速做到这一点。计算完整的图像然后显示它需要几秒钟,因为显示每个像素只需要几分钟。
重要的是我可以看到图像计算的进展。有没有办法在SDL 1.2中有效地解决这个问题?
我的代码现在看起来如下:
SDL_Surface* screen = NULL;
SDL_Surface* image = NULL;
SDL_Init(SDL_INIT_EVERYTHING);
//Set up screen
screen = SDL_SetVideoMode(img.width(), img.height(), 32, SDL_SWSURFACE);
// create surface with default values
image = SDL_CreateRGBSurface(SDL_SWSURFACE,img.width(),img.height(),32,0,0,0,0);
if(image == NULL) {
std::cout << "failed creating SDL surface";
}
// create array for pixels
Uint32 *pixels = (Uint32 *)image->pixels;
//Apply image to screen
SDL_BlitSurface(image, NULL, screen, NULL);
//Update screen
SDL_Flip(screen);
// compute image
for (int i = 0; i < img.width(); i++) {
for (int j = 0; j < img.height(); j++) {
img(i, j) = computeColor(i, j, img.width(), img.height());
pixels[i * img.width() + j] = SDL_MapRGB(image->format,(Uint8)getR(img(i,j)), (Uint8)getG(img(i,j)),(Uint8)getB(img(i,j)));
SDL_BlitSurface(image, NULL, screen, NULL);
SDL_UpdateRect(screen, i, j, i, j);
}
}
//Pause
SDL_Delay(2000);
//Free the loaded image
SDL_FreeSurface(image);
//Quit SDL
SDL_Quit();
答案 0 :(得分:0)
一次更改一个像素的通信开销太高。这与您的特定API几乎没有关系。
尝试跟踪时间,并以指数方式更改像素,直到经过足够的时间(比如1/100秒)。然后更新它们。 (仅在指数增加间隔后检查时钟)
这将为您提供进步,而不会像您的像素那样在一段时间内解决问题。
答案 1 :(得分:0)
您不需要中间图像,可以将像素直接放在屏幕表面上。你可以为每一行调用SDL_Flip()或SDL_UpdateRect(),而不是每个像素,它会更快。
此外,通过行而不是列循环将为您提供小的速度提升,因为单行上的像素在物理内存中彼此靠近,并且在现代CPU上顺序存储器访问更快。
// create array for pixels
Uint32 *pixels = (Uint32 *)screen->pixels;
// Clear screen
SDL_FillRect(screen, NULL, 0);
//Update screen
SDL_Flip(screen);
// compute image
for (int j = 0; j < img.height(); j++) {
for (int i = 0; i < img.width(); i++) {
img(i, j) = computeColor(i, j, img.width(), img.height());
pixels[i + j * img.width()] = SDL_MapRGB(image->format,(Uint8)getR(img(i,j)), (Uint8)getG(img(i,j)),(Uint8)getB(img(i,j)));
}
SDL_UpdateRect(screen, i, j, img.width(), 1);
}
// Display final result
SDL_Flip(screen);
SDL_Delay(2000);
你也可以为img.height()和img.width()创建一个单独的int变量,这样你就不会在每次迭代时都进行函数调用,但编译器通常能够优化它。