我在窗口模式下使用 SDL。
给定一个大精灵,比如 1024 x 640,将整个图像blit 成几个小块,比如32 x 32 px,比一次blit 整个图像更快吗?
我必须以窗口模式@ 30 FPS(至少)在屏幕上(1024 * 640)blit 背景。我认为窗口化时不能使用双缓冲和硬件表面......现在,我一次将整个精灵blit,但是对于简单的背景blitting,CPU消耗似乎非常高。
首先确保图像是像“PNG”这样的小文件类型格式。其次,在对图像进行 blitting 时,请确保您没有将透明度颜色添加到背景图像中,否则它是没有意义的,并且会占用大量 cpu 周期。这是我很久以前作为图像加载包装器编写的代码示例
SDL_Surface* altSDL::load_image(std::string filename)
{
SDL_Surface* loadedImage = NULL;
SDL_Surface* optimizedImage = NULL;
loadedImage = IMG_Load( filename.c_str() );
if( loadedImage != NULL )
{
optimizedImage = SDL_DisplayFormat( loadedImage );
SDL_FreeSurface( loadedImage );
}
else
{
Failure* fail;
fail = Failure::getInstance();
fail->failLog(filename);
}
if( optimizedImage != NULL )
{
Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0xFF, 0, 0xFF );
SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
}
return optimizedImage;
}
在此代码中,您将能够将所有图像传递到其中以非常无缝地优化,但在背景/大图像的情况下,您需要确保将最后一段代码更改为更多类似的内容像这样的东西:
//Added some Sudo code
if( loadedImage != NULL && !isBigImage)
{
optimizedImage = SDL_DisplayFormat( loadedImage );
SDL_FreeSurface( loadedImage );
}
else if(!isBigImage)
{
Failure* fail;
fail = Failure::getInstance();
fail->failLog(filename);
}
isBigImage 是我添加的 sudo 代码,是传入的参数;在某些情况下。这将使您的所有图像都得到优化,更小(应确保它们是 png 文件)并将使其透明度仅添加到小图像文件中,这样您的背景就不会降低 fps