文章目录
SDL分析
之前做过ffmpeg_SDL播放器时用到一些 记录一下
SDL_Init(uint flags)
初始化函数,使用之前调用,flags表示初始化去哪些子系统
flags | 子系统 |
---|---|
SDL_INIT_TIMER | 计时器子系统 |
SDL_INIT_AUDIO | 音频子系统 |
SDL_INIT_VIDEO | 视频子系统; 自动初始化事件子系统 |
SDL_INIT_JOYSTICK | 操纵杆子系统; 自动初始化事件子系统 |
SDL_INIT_HAPTIC | 触觉(力反馈)子系统 |
SDL_INIT_GAMECONTROLLER | 控制子系统; 自动初始化操纵杆子系统 |
SDL_INIT_EVENTS | 事件子系统 |
SDL_INIT_EVERYTHING | 所有上述子系统 |
SDL_INIT_NOPARACHUTE | 兼容性; 这个标志被忽略了 |
int成功时返回0,失败时返回负数错误码,使用SDL_GetError()可获取信息
if (SDL_Init(SDL_INIT_VIDEO)) { //视频子系统
printf("Could not initialize SDL - %s\n", SDL_GetError());
return -1;
}
SDL_Window&SDL_CreateWindow
SDL_Window* SDL_CreateWindow(const char* title,//窗口的标题,采用UTF-8编码
int x,//窗口的x坐标 SDL_WINDOWPOS_CENTERED:中间
int y,//窗口的y坐标 SDL_WINDOWPOS_UNDEFINED:未指定
int w,//窗口的宽度,以像素为单位
int h,//窗口的高度,以像素为单位
Uint32 flags)//0,或一个或多个SDL_WindowFlags,
eg:
SDL_Window *screen;
screen = SDL_CreateWindow("SDL Player", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screen_w, screen_h, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);//UNDEFINED为未指示
if (!screen) {
printf("SDL:could not create window_exiting:%s\n", SDL_GetError());
return -1;
}
SDL_WindowFlags列表:
flags | 含义 |
---|---|
SDL_WINDOW_FULLSCREEN | 全屏窗口 |
SDL_WINDOW_FULLSCREEN_DESKTOP | 当前桌面分辨率的全屏窗口 |
SDL_WINDOW_OPENGL | 窗口可用于OpenGL上下文 |
SDL_WINDOW_VULKAN | 可用于Vulkan实例的窗口 |
SDL_WINDOW_HIDDEN | 隐藏窗口 |
SDL_WINDOW_BORDERLESS | |
SDL_WINDOW_RESIZABLE | 窗口可以调整大小 |
SDL_WINDOW_MINIMIZED | 窗口最小化 |
SDL_WINDOW_MAXIMIZED | 窗口最大化 |
SDL_WINDOW_INPUT_GRABBED | 窗口可以捕获键盘输入焦点 |
SDL_WINDOW_ALLOW_HIGHDPI | 如果支持,则应在高DPI模式下创建窗口(> = SDL 2.0.1) |
SDL_Renderer(渲染器系列函数)
SDL_CreateRenderer
SDL_Renderer用SDL_CreateRenderer函数创建;
SDL_Renderer* SDL_CreateRenderer(SDL_Window* window, int index, Uint32 flags)
- SDL_Window* window:和渲染器上下文关联的窗体指针。
- int index:即将初始化的渲染器驱动程序的索引,如果是-1表示flags标志的第一个可用驱动程序。
- flags:0,或者一个或多个SDL_RendererFlags合并在一起。SDL_RendererFlags见下表
SDL_RendererFlags | 渲染器标志 |
---|---|
SDL_RENDERER_SOFTWARE | the renderer is a software fallback |
SDL_RENDERER_ACCELERATED | 渲染器使用硬件加速 |
SDL_RENDERER_PRESENTVSYNC | 显示与刷新率同步 |
SDL_RENDERER_TARGETTEXTURE | 渲染器支持渲染到纹理 |
SDL_RenderCopy
函数原型:
int SDL_RenderCopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect)
1
功能:将制定区域(srcrect)的纹理数据,拷贝到渲染目标尺寸为(dstrect)的渲染器上下文(renderer)中,为下一步的渲染做准备。
参数列表:
参数 | 释义 |
---|---|
renderer | 渲染器的上下文 |
texture | 纹理,纹理的显示效果如颜色、透明度(alpha值)等会收到其它接口设置最终产生不一样的效果,这些接口有:SDL_SetTextureColorMod、SDL_SetTextureAlphaMod、SDL_SetTextureBlendMode |
srcrect | 需要拷贝的SDL_Texture尺寸(用SDL_Rect结构表达),NULL则表示整个纹理 |
dstrect | 渲染区域的尺寸(用SDL_Rect结构表达),NULL表示整个渲染整个渲染区域; 如果纹理尺寸不够,将会拉伸或压缩纹理。 |
SDL_RenderPresent
函数原型:
void SDL_RenderPresent(SDL_Renderer* renderer)
功能:将渲染器上下文中的数据,渲染到关联窗体上去。
参数:renderer:渲染器上下文。
SDL的渲染功能在后备缓冲区中运行。也就是说,调用诸如SDL_RenderDrawLine
之类的渲染函数不会直接在屏幕上放置一条线,而是更新后备缓冲区。 因此,您可以构建整个场景并将组合后的缓冲区作为完整图片调用SDL_RenderPresent
呈现给屏幕。
因此,在使用SDL的渲染API时,会对帧进行所有绘制,然后每帧调用此函数一次,以向用户显示最终绘图。
更新后备缓冲区。 因此,您可以构建整个场景并将组合后的缓冲区作为完整图片调用SDL_RenderPresent
呈现给屏幕。
因此,在使用SDL的渲染API时,会对帧进行所有绘制,然后每帧调用此函数一次,以向用户显示最终绘图。
数据每次显示后,后备缓冲应视为无效。不要假设每帧之间遗留先前的内容。 强烈建议您在开始每个新帧的绘制之前调用SDL_RenderClear来初始化后备缓冲区,即使您打算覆盖每个像素也是如此。