博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ffmpeg(ignore)------显示相关-SDL及函数 1.2 2.0版本
阅读量:3921 次
发布时间:2019-05-23

本文共 2827 字,大约阅读时间需要 9 分钟。

在阅读本文前,需要读者具备初步的sdl知识,可以参考这篇文章及其系列:

获取: SDL的官方网站(http://www.libsdl.org/)下载

想要SDL播放就要提供sdl所支持的 像素格式 比如:AV_PIX_FMT_YUV420P==>SDL_PIXELFORMAT_IYUV

SDL

实际上是对底层绘图API(Direct3D,OpenGL)的封装,使用起来明显简单于直接调用底层

在这里插入图片描述

通用初始化

#include 
int screen_w,screen_h;SDL_Surface *screen; 显示图像的容器,即SDL弹出的窗口。在SDL1.x版本中,只可以创建一个SDL_Surface。SDL_VideoInfo *vi;SDL_Overlay *bmp; 用于存储YUV数据。一个SDL_Overlay对应一帧YUV数据。SDL_Rect rect; 确定屏幕上的一个矩形区域{
4个成员:左上角x、y轴坐标+矩形的宽高} (允许多个SDL_Rect→不同位置显示相同内容) 初始化: int SDLCALL SDL_Init(Uint32 flags): 初始化SDL。 /* flags可以取下列值:(依据flag→决定调用对应函数初始化对应子系统) SDL_INIT_TIMER:定时器 →→→调用初始化函数SDL_TicksInit(),SDL_TimerInit() SDL_INIT_AUDIO:音频 →→→调用初始化函数SDL_AudioInit() SDL_INIT_VIDEO:视频 →→→调用初始化函数SDL_VideoInit() SDL_INIT_JOYSTICK:摇杆 ...... SDL_INIT_HAPTIC:触摸屏 ...... SDL_INIT_GAMECONTROLLER:游戏控制器 ...... SDL_INIT_EVENTS:事件 ...... SDL_INIT_NOPARACHUTE:不捕获关键信号(这个不理解) ...... SDL_INIT_EVERYTHING:包含上述所有选项 ...... */1. 通过将传入的flag与子系统的宏定义(例如SDL_INIT_VIDEO,SDL_INIT_AUDIO等)相与,判断是否需要初始化该子系统。2. 有很多的预定义的宏(决定是否编译/支持这些子系统),必须要先编译,然后初始化flag选中才能生效

1.2版本

在这里插入图片描述
在这里插入图片描述

SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);//窗口的宽度、高度、单个像素占用位数和一个标记变量不仅仅是创建了一个窗口,它还创建了一块内存区域叫"screen buffer",用来显示图像。这块区域负责显示画面到屏幕[ Uint32 flags=SDL_HWSURFACE | SDL_DOUBLEBUF](https://www.cnblogs.com/nanguabing/archive/2012/04/12/2443724.html)SDL_Overlay *bmp = SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,SDL_YV12_OVERLAY, screen);//SDL绑定播放窗口 及 视频窗口缩放         参数:宽,高,YUV格式和SDL_Surface。

2.0版本

在这里插入图片描述

SDL_CreateWindow(): 创建窗口(→→SDL_Window)  2.0中运行多个窗口SDL_CreateTexture() 创建显示数据结构体(一个SDL_Texture对应一帧YUV数据。)SDL_CreateRenderer(): 基于窗口创建渲染器(Render)。 SDL_Renderer():用于渲染SDL_Texture至SDL_Window。SDL_CreateTexture(): 创建纹理(Texture)。 循环渲染数据: SDL_UpdateTexture(): 设置纹理的数据。 SDL_RenderCopy(): 纹理复制给渲染器。 SDL_RenderPresent(): 显示。

SDL事件的处理

在处理SDL的事件有两种模式,一种是等待 SDL_WaitEvent,另一种是轮询SDL_PollEventSDL_Event event可以取回事件队列中的第一个事件:int SDL_PollEvent(SDL_Event *event);	非阻塞式轮询  				将队列头中的事件拿出(移出)int SDL_WaitEvent(SDL_Event *event);	队列为空时→阻塞等待 		非空时→将队列头中的事件拿出(移出) SDL_WaitEventTimeout		 限时阻塞等待SDL_PeekEvent: 从队列中取出事件,但该事件不从队列中删除。SDL_PushEvent: 向队列中插入事件。int SDL_PeepEvent(SDL_Event *event);	只是偷看第一个事件的内容。。。判断依据:SDL_Event event.type及对应的成员 比如那个按键按下了针对特定事件可以使用:Uint8 *SDL_GetKeyState(int *numkeys);Uint8 SDL_GetMouseState(int *x, int *y);还有一些类似的函数,这些函数返回一个数组来保存一些事件的状态,通过访问数组就能知道相应的事件状态
下面的代码是为了让窗口一直显示:while(!quit){
SDL_Event event; while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT: //直到检测到用户按了ctrl+c 或 使用鼠标点击关闭按钮后才关闭 quit = 1; break; default: SDL_Log("."); } }}表现:一直在重复内层循环→CPU100% 应对: 1.在完成循环delay一下 2.改用SLD_WaitEvent 当发现队列为空时会阻塞在那里,并将CPU释放(游戏中实时性要求高→SDL_PollEvent 而实时性要求不高时可以用SLD_WaitEvent)https://www.imooc.com/article/25270
你可能感兴趣的文章
今天你内卷了吗?
查看>>
设计模式之代理模式
查看>>
结构型设计模式总结
查看>>
dotNET:怎样处理程序中的异常(实战篇)?
查看>>
What is 测试金字塔?
查看>>
.Net Core HttpClient处理响应压缩
查看>>
十分钟搭建自己的私有NuGet服务器-BaGet
查看>>
efcore 新特性 SaveChanges Events
查看>>
龙芯3A5000初样顺利交付流片
查看>>
用了Dapper之后通篇还是SqlConnection,真的看不下去了
查看>>
ABP快速开发一个.NET Core电商平台
查看>>
[NewLife.Net]单机400万长连接压力测试
查看>>
使用Azure人脸API对图片进行人脸识别
查看>>
快醒醒,C# 9 中又来了一堆关键词 init,record,with
查看>>
【招聘(深圳)】轻岁 诚聘.NET Core开发
查看>>
欢迎来到 C# 9.0(Welcome to C# 9.0)
查看>>
Dapr微服务应用开发系列1:环境配置
查看>>
使用 Visual Studio 2019 批量添加代码文件头
查看>>
【BCVP更新】StackExchange.Redis 的异步开发方式
查看>>
.NET5.0 Preview 8 开箱教程
查看>>