SDL学习笔记(1)——环境搭建

目录

    • 一、SDL简介
    • 二、我学习SDL的目的
    • 三、开发环境
    • 四、验证
    • 五、参考资料

  简单介绍SDL,并且搭建mac下的命令行开发环境。用一个简单的例子,验证开发环境的正确性。

一、SDL简介

  SDL是一个跨平台开发库,支持Windows,Mac OS X,Linux,IOS和Android。SDL封装了各个平台不同的系统底层接口,而提供给上层开发者统一的接口,大大简化开发者对音频,键盘,鼠标,操纵杆和图形硬件的低级访问。

  比如,跨平台的图形硬件访问功能,windows平台上SDL是通过封装Direct3D实现的,那么在Mac平台就是通过封装OpenGL来实现。开发者不需要关注各个平台的底层接口细节,只需要关注SDL 提供的接口即可。
SDL学习笔记(1)——环境搭建_第1张图片

  SDL有两个主要版本,1.x和2.x。在2.x中增加使用了硬件来加速渲染等等很多的改动。如果没有必要,我们从2.0开始学习就可以了。而且,目前官方wiki只有2.0的开发文档。

  SDL是基于C语言编写的。许多著名的游戏,比如文明、雷神之锤,还有一些著名的播放器,比如ffplay、ijkplayer,都在使用SDL。

二、我学习SDL的目的

  1. 了解其主要接口,以便进一步学习依赖SDL的ffplay播放器。
    所以重点会在视频渲染部分,深入系统的学习可能需要放到后面。

  2. 学习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

你可能感兴趣的:(音视频,sdl)