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 支持渲染纹理
好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***