SDL是一个跨平台开发库,支持Windows,Mac OS X,Linux,IOS和Android。SDL封装了各个平台不同的系统底层接口,而提供给上层开发者统一的接口,大大简化开发者对音频,键盘,鼠标,操纵杆和图形硬件的低级访问。
比如,跨平台的图形硬件访问功能,windows平台上SDL是通过封装Direct3D实现的,那么在Mac平台就是通过封装OpenGL来实现。开发者不需要关注各个平台的底层接口细节,只需要关注SDL 提供的接口即可。
SDL有两个主要版本,1.x和2.x。在2.x中增加使用了硬件来加速渲染等等很多的改动。如果没有必要,我们从2.0开始学习就可以了。而且,目前官方wiki只有2.0的开发文档。
SDL是基于C语言编写的。许多著名的游戏,比如文明、雷神之锤,还有一些著名的播放器,比如ffplay、ijkplayer,都在使用SDL。
了解其主要接口,以便进一步学习依赖SDL的ffplay播放器。
所以重点会在视频渲染部分,深入系统的学习可能需要放到后面。
学习SDL这样一个跨平台库如何处理平台差异性,如何对底层接口进行封装。
这部分属于扩展部分,后面有时间会专门来学习记录。
我这里使用的mac开发环境,从这个链接上可以找到各个平台的开发包,包括mac平台的,目前mac平台最新支持版本是SDL2-2.0.14.dmg。
另外,我们还需要一些扩展库的支持。比如SDL本身支持BMP格式的图片,而SDL扩展库支持png类型的图片,可大大节省存储空间。这正是扩展库SDL_image所能做的。此外,还有SDL_ttf, SDL_mixer等扩展库,这里因为没有用到,不展开来说也不安装。
windows可以集成到vs中,mac可以集成到Xcode等开发环境中。相应的方法我就不在介绍了,相关文章很多。
不过,我这里只是简单的使用,我准备采用命令行方式编译连接。因此,我这里没有使用IDE。
使用brew安装SDL开发库:
$ brew install sdl2 sdl2_image
Warning: sdl2 2.0.12_1 is already installed and up-to-date
To reinstall 2.0.12_1, run `brew reinstall sdl2`
Warning: sdl2_image 2.0.5 is already installed and up-to-date
To reinstall 2.0.5, run `brew reinstall sdl2_image`
使用命令行编译
gcc your_c_code.c `pkg-config --cflags --libs sdl2 sdl2_image`
通过初始化和销毁的函数,我们来初识SDL编程,主要目的是验证我们的环境的正确定。
在调用SDL大部分函数前,必须首先调用 SDL_Init() ;在SDL应用程序退出之前,应调用SDL_Quit() 以安全关闭所有子系统,包括默认子系统。SDL_Init调用完成后,可以调用SDL_InitSubSystem初始化一些SDL_Init没有初始化的子系统,同样的,使用SDL_QuitSubSystem来关闭这些子系统。
通过第一个实例,简单了解一下这四个函数。
文件命名为sdl_init_and_shutdown.c:
//sdl_init_and_shutdown.c
#include
#include
int main(int argc, char* argv[])
{
int sdl_initialized = 0;
//调用SDL函数前,需要先调用SDL_Init
sdl_initialized = !SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
if (!sdl_initialized) {
printf("Unable to initialize SDL: %s", SDL_GetError());
return 1;
}
printf("SDL Init video audio subsystem success !\n");
//在SDL_Init调用后,初始化一些SDL_Init没有初始化的子系统
if (0 == SDL_InitSubSystem(SDL_INIT_JOYSTICK)) {
printf("SDL Init joystick subsystem success !\n");
//do something...
//退出子系统
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
printf("SDL Quit joystick subsystem success !\n");
}
//退出
SDL_Quit();
printf("SDL Quit all !\n");
return 0;
}
编译运行,使用-o 将编译出来的可执行文件 命名为 sdl_init_and_shutdown
gcc sdl_init_and_shutdown.c `pkg-config --cflags --libs sdl2 sdl2_image` -o sdl_init_and_shutdown
输出
$ ./sdl_init_and_shutdown
SDL Init video audio subsystem success !
SDL Init joystick subsystem success !
SDL Quit joystick subsystem success !
SDL Quit all !
首先,验证了我们的环境是没问题的。
其次,我们大致认识了一下SDL的,Video和Audio两个子系统。并且,在中途初始化了摇杆子系统,做了一些操作。SDL支持的子系统共有7个,如下表所示。
Flag | Value |
---|---|
SDL_INIT_TIMER | timer subsystem |
SDL_INIT_AUDIO | audio subsystem |
SDL_INIT_VIDEO | video subsystem; automatically initializes the events subsystem |
SDL_INIT_JOYSTICK | joystick subsystem(遥杆子系统); automatically initializes the events subsystem |
SDL_INIT_HAPTIC | haptic (force feedback) subsystem(触觉反馈子系统) |
SDL_INIT_GAMECONTROLLER | controller subsystem; automatically initializes the joystick subsystem(游戏控制子系统) |
SDL_INIT_EVENTS | events subsystem |
SDL_INIT_EVERYTHING | all of the above subsystems |
SDL_INIT_NOPARACHUTE | compatibility; this flag is ignored |
[1]. Introduction to SDL 2.0