SDL2的重要数据结构、API、操作流程


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

SDL 是什么?   

SDL 是 Simple Direct Media Layer (简易直控媒体层)的缩写。

它是一个跨平台的多媒体库, 以用于直接控制底层的多媒体硬件的接口。 

    SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。

目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。



    这些多媒体功能包括了音频、 键盘和鼠标 (事件) 、游戏摇杆等

    当然,最为重要的是提供了 2D 图形帧缓冲( framebuffer )的接口 ,以及为 OpenGL 与各种操作系统之间提供了统一的标准接口以实现3D图形。 

从这些属性我们可以看出, SDL 基本上可以认为是为以电脑游戏为核心开发的多媒体库


    SDL支持主流的操作系统,包括 Windows 和 Linux 。在官方的介绍中,我们可以找到 它所支持的其他平台( SDL  supports  Linux,   Windows ,  Windows  C E , BeO S , Mac OS, Mac OS X , FreeBSD, NetBSD, Open BSD, BSD/OS, Solaris, IRIX, and  QNX.  ) 。 


    SDL本身从C语言开发,并且能很好的在 C++ 等 高级语言中使用。 

在官方可以看到 SDL 所支持的语言很多。 ( Including  Ada,  C#, Java ,  Lua,  Objective   C, Pascal,  Perl ,  PHP ,   Python ,  Ruby ,)             


    SDL 在 GNU LGPL  version 2 下发 布, 这意味着你可以免费的使用。 

并且可以免费的用 于商业软件的制作(只要你直接使用 SDL 的动 态链接库, W i nd ow s 下的 SDL.dll ) 。

如果你 将 SDL 库编译进了自己的二进制代码中, 你需要指明你所使用的 SDL 库的版本以及包括你自己修改的源代码, 并说明这些代码的原始出处。

这是很宽松的法律, 你可以用如此强大的 多媒体库完全合法的免费开发商业游戏。  






SDL2的基本流程

1、初始化SDL

2、创建窗口

3、创建渲染器

4、清空缓冲区

5、绘制要显示的内容

6、最终将缓冲区内容渲染到window窗口上

7、销毁渲染器

8、销毁窗口

9、退出SDL



SDL2的重要结构概念


SDL_Window:

SDL绘图的窗口,所有的操作都依托SDL_Window中进行。


SDL_Surface:

在SDL1.2和SDL2中有些许区别,以SDL2为基准,SDL_Surface是与内存结合的,是二维像素内存,可以显示文字、图像、并且可以叠加,在SDL_Window中显示。


SDL_Texture:

这个是SDL2新增加的结构,与SDL_Surface类似,不同的是SDL_Texture是与硬件有关的,可以硬件驱动,感觉就像是SDL_Surface是软件显示图像,而SDL_Texture是硬件显示图像,SDL_Texture结构可以从SDL_Surface结构得到,通过SDL_CreateTextureFromSurface(SDL_Renderer* renderer, SDL_Surface* surface)得到。


SDL_Render:

用以渲染、粉刷图像,与SDL_Texture和SDL_Window相结合,将SDL_Texture显示在SDL_Window中,而SDL_Surface是可以直接在SDL_Window上操作,不需要中间环节即SDL_Render的帮助。

SDL_Surface ≈ SDL_Texture + SDL_Render


SDL_Event:

用于捕获用户的事件包括按键、鼠标、手柄,SDL2与用户的互动离不开SDL_Event结构,SDL_Event的处理是以队列(消息队列/事件队列)形式为基础的,先发生的事件先处理,通过SDL_PollEvent(SDL_Event* event)来查询队列中的事件,从而处理。




SDL2 API简介

SDL_Init 初始化

int SDL_Init(Uint32 flags)


flages:

SDL_INIT_TIMER 定时器子系统

SDL_INIT_AUDIO 音频子系统

SDL_INIT_VIDEO 视频子系统,同时会初始化事件子系统

SDL_INIT_EVENTS 事件子系统

SDL_INIT_EVERYTHING 初始化所有子系统=


退出:SDL_Quit(void);


SDL_CreateWindow 创建窗口


SDL_Window* SDL_CreateWindow(const char *title,

                             int x, int y, int w,

                             int h, Uint32 flags);




title:窗口标题

x,y,w,h:窗口坐标

flags:

 ::SDL_WINDOW_FULLSCREEN,//全屏         ::SDL_WINDOW_OPENGL,//使用OpenGL上下文

 ::SDL_WINDOW_HIDDEN, //窗口不可见       ::SDL_WINDOW_BORDERLESS, //无边框

 ::SDL_WINDOW_RESIZABLE,//窗口大小可变    ::SDL_WINDOW_MAXIMIZED, //窗口最大化

 ::SDL_WINDOW_MINIMIZED,//窗口最小化      ::SDL_WINDOW_INPUT_GRABBED,//输入捕获

销毁:SDL_DestroyWindow(...)


SDL_CreateRenderer 创建渲染器

SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,

                                 int index,

                                 Uint32 flags)

window: 指明在哪个窗口里进行渲染

index: 指定渲染驱动的索引号。一般指定为 -1.

flags:

 SDL_RENDERER_SOFTWARE //The renderer is a software fallback 软件备份

 SDL_RENDERER_ACCELERATED //The renderer uses hardware acceleration 硬件加速

 SDL_RENDERER_PRESENTVSYNC //Present is synchronized with the refresh rate 刷新率同步

 SDL_RENDERER_TARGETTEXTURE //The renderer supports rendering to texture 支持渲染纹理




好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***