首先,这篇帖子参考了雷神的帖子,具体的可以去雷神那里去看。
1.初始化函数
int SDLCALL SDL_Init(Uint32 flags);
param:
SDL_INIT_TIMER:定时器
SDL_INIT_AUDIO:音频
SDL_INIT_VIDEO:视频
SDL_INIT_JOYSTICK:摇杆
SDL_INIT_HAPTIC:触摸屏
SDL_INIT_GAMECONTROLLER:游戏控制器
SDL_INIT_EVENTS:事件
SDL_INIT_NOPARACHUTE:不捕获关键信号(这个不理解)
SDL_INIT_EVERYTHING:包含上述所有选项
return:成功0,失败非0
2.获取错误码
Mix_GetError();
param:无参数
return:返回字符串形式的错误信息
3.创建一个符合参数的窗口
SDL_Window * SDLCALL SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags);
param:
title 窗口标题
x 窗口左上角x坐标
y 窗口左上角y坐标
w 窗口的宽度
h 窗口的高度
flags:
::SDL_WINDOW_FULLSCREEN,
::SDL_WINDOW_OPENGL,
::SDL_WINDOW_HIDDEN,
::SDL_WINDOW_BORDERLESS,
::SDL_WINDOW_RESIZABLE,
::SDL_WINDOW_MAXIMIZED,
::SDL_WINDOW_MINIMIZED,
::SDL_WINDOW_INPUT_GRABBED,
::SDL_WINDOW_ALLOW_HIGHDPI.
return:窗口句柄
4.根据一个传入的句柄创建一个窗口
SDL_Window * SDL_CreateWindowFrom(const void *data);
parameter: data (HWND)形式的窗口句柄
return:创建好的窗口句柄
5.创建渲染器
SDL_Renderer * SDL_CreateRenderer(SDL_Window * window,
int index, Uint32 flags);
param:
window 创建好的窗口
index 打算初始化的渲染设备的索引。设置“-1”则初始化默认的渲染设备。
flags 常使用SDL_RENDERER_ACCELERATED
SDL_RENDERER_SOFTWARE :使用软件渲染
SDL_RENDERER_ACCELERATED :使用硬件加速
SDL_RENDERER_PRESENTVSYNC:和显示器的刷新率同步
SDL_RENDERER_TARGETTEXTURE :不太懂
返回创建完成的渲染器的ID。如果创建失败则返回NULL。
return:创建好的渲染器
6.创建纹理
SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer,Uint32 format,int access, int w,int h);
params:
renderer 创建好的渲染器
format 纹理的格式,有YUV和RGB的,下面只是其中一部分
SDL_PIXELFORMAT_YV12
SDL_PIXELFORMAT_IYUV
SDL_PIXELFORMAT_YUY2
SDL_PIXELFORMAT_UYVY
SDL_PIXELFORMAT_YVYU
SDL_PIXELFORMAT_NV12
SDL_PIXELFORMAT_NV21
access
SDL_TEXTUREACCESS_STATIC :变化极少
SDL_TEXTUREACCESS_STREAMING :变化频繁
SDL_TEXTUREACCESS_TARGET :暂时没有理解
w 纹理的宽
h 纹理的高
return 创建成功则返回纹理的ID,失败返回0。
7.更新纹理
int SDLCALL SDL_UpdateTexture(SDL_Texture * texture,const SDL_Rect * rect,const void *pixels, int pitch);
param:
texture:目标纹理。
rect:更新像素的矩形区域。设置为NULL的时候更新整个区域。
pixels:像素数据。
pitch:一行像素数据的字节数。
return:
成功的话返回0,失败的话返回-1。
8.为纹理加锁,锁期间只允许写入
int SDLCALL SDL_LockTexture(SDL_Texture * texture,
const SDL_Rect * rect,
void **pixels, int *pitch);
param:
texture 目标纹理
rect 目标矩形
pixels 像素
pitch 暂不清楚
9.将纹理复制到渲染器
int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer,SDL_Texture * texture,const SDL_Rect * srcrect,const SDL_Rect * dstrect);
renderer:目标渲染器。
texture:输入纹理。
srcrect:选择输入纹理的一块矩形区域作为输入。设置为NULL的时候整个纹理作为输入。
dstrect:选择渲染目标的一块矩形区域作为输出。设置为NULL的时候整个渲染目标作为输出。
成功的话返回0,失败的话返回-1。
10使用渲染器显示
void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer);
renderer:目标渲染器。
11 释放纹理
void SDL_DestroyTexture( texture );
texture 目标纹理
12.解锁
void SDLCALL SDL_UnlockTexture(SDL_Texture * texture);
texture 目标纹理
13 延时
SDL_delay() 延时,一秒25帧,防止出现快进,播放速度 每秒延时40
14 删除渲染器
void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer);
renderer: 目标渲染器
15. 释放窗口
void SDLCALL SDL_DestroyWindow(SDL_Window * window);
window : 目标窗口
16.退出SDL
void SDLCALL SDL_Quit(void);
17.设置纹理混合模式
int SDLCALL SDL_SetTextureBlendMode(SDL_Texture * texture,
SDL_BlendMode blendMode);
texture 目标纹理
blendMode 混合模式
SDL_BLENDMODE_NONE
SDL_BLENDMODE_BLEND
SDL_BLENDMODE_ADD
SDL_BLENDMODE_MOD
SDL_BLENDMODE_INVALID
18.设置透明度
int SDLCALL SDL_SetTextureAlphaMod(SDL_Texture * texture,
Uint8 alpha);
param
texture 目标纹理
alpha 透明度
return 0成功,非0失败
19.打开声音设备
int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired,SDL_AudioSpec * obtained);
SDL_AudioSpec参数
int freq; 采样率,每秒采样次数
SDL_AudioFormat format; 音频数据格式;format 告诉SDL我们将要给的格式。在“S16SYS”中的S表示有符号的signed,
16表示每个样本是16位长的,SYS表示大小头的顺序是与使用的系统相同的。这些格式是
由avcodec_decode_audio2为我们给出来的输入音频的格式。
AUDIO_U16SYS:Unsigned 16-bit samples
AUDIO_S16SYS:Signed 16-bit samples
AUDIO_S32SYS:32-bit integer samples
AUDIO_F32SYS:32-bit floating point samples
Uint8 channels; 声音的通道数 1 单声道, 2 立体声;
Uint8 silence; 表示静音的值。因为声音采样是有符号的,所以0当然就是这个值。
Uint16 samples; audio buffer size in samples (power of 2); 详情参考“讨论”
Uint16 padding; 考虑到兼容性的一个参数。
Uint32 size; 音频缓存区大小(字节数),当我们想要更多声音的时候,我们想让SDL给出来的声音缓冲区的尺寸。
一个比较合适的值在512到8192之间;ffplay使用1024。
SDL_AudioCallback callback; 当音频设备需要更多数据时调用的回调函数;
void *userdata; 这个是SDL供给回调函数运行的参数。我们将让回调函数得到整个编解码的上下文信息;
//回调格式
void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream,int len);
userdata:SDL_AudioSpec结构中的用户自定义数据,一般情况下可以不用。
stream:该指针指向需要填充的音频缓冲区。
len:音频缓冲区的大小(以字节为单位)。
在回调函数中可以使用SDL_MixAudio()完成混音等工作。众所周知SDL2和SDL1.x关于视频方面的API差别很大。
但是SDL2和SDL1.x关于音频方面的API是一模一样的。唯独在回调函数中,SDL2有一个地方和SDL1.x不一样:
SDL2中必须首先使用SDL_memset()将stream中的数据设置为0。
desired:期望的参数。
obtained:实际音频设备的参数,一般情况下设置为NULL即可。
20循环播放声音
void SDLCALL SDL_PauseAudio(int pause_on)
当pause_on设置为0的时候即可开始播放音频数据。设置为1的时候,将会播放静音的值。
21 拿到制定窗口的句柄
SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window * window);
param window 目标窗口句柄
return 对应窗口的表面
一点心得:纹理(texture)和表面(surface)的区别,纹理是硬件的概念,可以使用GPU,性能较好,而表面是软件的概念,是在内存中的,性能不是很好。