SDL视频子系统
在SDL中最为常用子系统就是视频子系统。这里说的视频不是指我们平常播放的电影等,而是指在屏幕上显示出来的东西,你需要在屏幕上显示图片、文字等那就必须使用视频子系统,否则什么都看不到,视频子系统支持:设置视频模式或者说创建视频窗口;支持直接的图像帧缓冲;支持Alpha像素混合;支持Blit位块传输(可以硬件加速);支持窗口管理;支持图形渲染。
要使用视频子系统首先要创建一个SDL窗口(或者说设置SDL的显示模式),我们可以使用:
/*
功能:建立SDL显示表面
参数:int width 窗口宽度 单位象素
int height 窗口高度 单位象素
int bpp 窗口象素位数,如果为0,则取当前窗口默认象素数
Unit32 flags 位标,标示窗口特性
返回值:SDL_Surface *,成功返回窗口指针,失败返回NULL
*/
SDL_Surface *SDL_SetVideoMode
(int width, int height, int bpp, Uint32 flags);
来创建一个窗口,以后所有东西都必须刷到这个窗口才能显示。函数的返回值是SDL_Surface *,SDL_Surface也称表面(或者说蒙皮),是需要显示的东西,可能是一张图片,也可能是一个字符串。我们的应用中可能需要显示很多的东西,所以可能创建很多的表面,但请记住无论有多少个表面,但只有使用SDL_SetVideoMode函数产生的表面(或窗口)才能显示,其他任何表面必须刷到这个窗口上才可以显示,这一点很重要。打个比方这个窗口就像是一块白板,你需要显示的东西必须贴在白板上才能显示,并且后贴上的东西会覆盖以前的东西。下面是建立显示窗口的代码:
1 /* 2 功能:建立SDL显示窗口 3 作者:csl 4 日期:2012-5-4 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include "SDL.h" 9 10 SDL_Surface *gpScreen;//显示表面 11 12 int main(int argc,char *argv[]) 13 { 14 if((SDL_Init(SDL_INIT_VIDEO)==-1)) //初始化视频子系统 15 { 16 printf("Unable to init SDL: %s\n", SDL_GetError()); 17 exit(-1); 18 } 19 atexit(SDL_Quit);// 注册SDL_Quit,当退出时调用,使得退出时程序自动清理 20 21 //创建32位600*480窗口 22 gpScreen = SDL_SetVideoMode(600,480, 32, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF ); 23 if(!gpScreen) 24 { 25 exit(1); 26 } 27 28 SDL_Delay(3000); //暂停3秒 29 SDL_FreeSurface(gpScreen);//退出程序前必须释放 30 31 system("pause"); 32 return 0; 33 }
gpScreen是显示窗口的指针,全局变量。第22行建立显示窗口,flags是位标,标示窗口特性,常用标示已经粗体显示:
SDL_SWSURFACE | 在系统内存创建表面 |
SDL_HWSURFACE | 在显内存创建表面 |
SDL_ASYNCBLIT | 显示表面的异步更新,这回降低但cpu机器的性能,但在多处理器机子上会增加速度 |
SDL_ANYFORMAT | 通常如果表面的像素深度不可用(比如你指定64,但你的机器不支持),则SDL将模拟一个影子表面。这个标志禁止这种做法。这将使SDL使用该表面不考虑bpp |
SDL_DOUBLEBUF | 使用双缓冲 |
SDL_FULLSCREEN | 全屏模式 |
SDL_OPENGL | 创建一个OpenGL渲染环境 |
SDL_RESIZABLE | 创建一个可变尺寸的窗口 |
SDL_NOFRAME | 创建一个无边框和标题的窗口。 |
这些常量可以组合使用,比如SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE,表示在显存里创建一个全屏窗口,使用双缓冲。注意:一般使用全屏模式也会使用双缓冲;如果使用在显存创建表面也会使用双缓冲。建议使用SDL_HWSURFACE | SDL_DOUBLEBUF,如果出现错误可以尝试使用SDL_SWSURFACE。
调用函数后应该检测gpScreen是否为空,为空则应结束程序。在程序退出前,必须调用SDL_FreeSurface释放gpScreen所指的窗口资源。
关于SDL_Surface详细资料在视频子系统基本概念里做了详细的说明。