
(音视频学习笔记):SDL环境搭建及应用介绍
下载地址:访问 SDL 的官方网站或相关镜像站点下载最新版本的 SDL。 安装依赖:在 Windows 环境中,确保安装了所有必要的依赖库,例如 x11-dev 等。 下载源码:从 SDL 的官方网站下载源码包,例如 SDL2-2.0.10.tar.gz。 编译安装:解压源码包,进入目录执行以下命令: 安装依赖:如果在编译过程中遇到 初始化 SDL 系统: 创建窗口: 创建渲染器: 创建纹理并设置数据: 更新纹理数据: 渲染并显示: 创建线程: 等待线程: 锁机制:
发布日期:2021-05-07 15:20:23
浏览次数:24
分类:精选文章
本文共 5106 字,大约阅读时间需要 17 分钟。
SDL 开发指南
简介
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,主要使用C语言编写。SDL 提供了丰富的函数接口,支持图像、声音和输出等多种多媒体功能,使开发者能够通过相似的代码在不同平台(如 Linux、Windows、Mac OS X 等)上开发应用程序。SDL广泛应用于游戏开发、模拟器、媒体播放器等多媒体领域。
环境搭建
Windows 环境搭建
Linux 环境搭建
./configuresudo make install
Could not initialize SDL - No available video device
错误,说明系统中没有安装 x11 库文件。运行以下命令安装相关依赖:sudo apt-get install libx11-devsudo apt-get install xorg-dev
SDL 子系统
SDL 将功能分成多个子系统(subsystem),具体包括:
- 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 Window 显示
基本操作
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *window = NULL;window = SDL_CreateWindow("Basic Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
SDL_Renderer *renderer = NULL;renderer = SDL_CreateRenderer(window, -1, 0);
SDL_Texture *texture = NULL;texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 640, 480);
SDL_UpdateTexture(texture, NULL, pixels, pitch);
SDL_RenderCopy(renderer, texture, NULL, NULL);SDL_RenderPresent(renderer);
事件处理
常用事件类型
- SDL_WaitEvent():等待一个事件。
- SDL_PushEvent():发送一个事件。
- SDL_PumpEvents():将硬件产生的事件放入队列。
- SDL_PeekEvents():从队列中提取一个事件。
- SDL_Event:事件结构体。
示例代码
#include#include int main() { SDL_Window *window = NULL; SDL_Event event; int b_exit = 0; // 初始化 SDL_Init(SDL_INIT_VIDEO); window = SDL_CreateWindow("Event Example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS); if (!window) { printf("Could not create window: %s\n", SDL_GetError()); return 1; } // 创建渲染器 SDL_Renderer *renderer = NULL; renderer = SDL_CreateRenderer(window, -1, 0); // 设置颜色 SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 清屏并绘制 SDL_RenderClear(renderer); SDL_RenderPresent(renderer); // 处理事件 while (!b_exit) { SDL_WaitEvent(&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_a: printf("Key down a\n"); break; case SDLK_s: printf("Key down s\n"); break; case SDLK_d: printf("Key down d\n"); break; case SDLK_q: printf("Key down q and push quit event\n"); event.type = FF_QUIT_EVENT; SDL_PushEvent(&event); break; default: printf("Key down 0x%x\n", event.key.keysym.sym); break; } break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) { printf("Mouse down left\n"); } else if (event.button.button == SDL_BUTTON_RIGHT) { printf("Mouse down right\n"); } else { printf("Mouse down %d\n", event.button.button); } break; case FF_QUIT_EVENT: printf("Receive quit event\n"); b_exit = 1; break; } } // 销毁资源 SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0;}
多线程开发
基本操作
SDL_Thread *t = SDL_CreateThread(thread_work, "thread_work", NULL);
SDL_WaitThread(t, NULL);
SDL_mutex *s_lock = SDL_CreateMutex();// 获取锁SDL_LockMutex(s_lock);// 提供资源并等待信号SDL_CondWait(s_cond, s_lock);// 释放锁SDL_UnlockMutex(s_lock);
示例代码
#include#include int main() { static SDL_mutex *s_lock = NULL; static SDL_cond *s_cond = NULL; // 初始化 s_lock = SDL_CreateMutex(); s_cond = SDL_CreateCond(); if (!s_lock || !s_cond) { printf("Failed to create mutex/condition: %s\n", SDL_GetError()); return -1; } // 创建子线程 SDL_Thread *t = SDL_CreateThread(thread_work, "thread_work", NULL); if (!t) { printf("Failed to create thread: %s\n", SDL_GetError()); return -1; } // 等待子线程完成 for (int i = 0; i < 2; ++i) { sleep(2); printf("Main thread: =========>\n"); } // 提供信号 printf("Main thread: ==========================\n"); SDL_LockMutex(s_lock); SDL_CondSignal(s_cond); printf("Main thread: ==========================\n"); sleep(10); // 释放锁 SDL_UnlockMutex(s_lock); printf("Main thread: ==========================\n"); // 等待子线程 SDL_WaitThread(t, NULL); printf("Main thread: thread completed\n"); // 销毁资源 SDL_DestroyMutex(s_lock); SDL_DestroyCond(s_cond); return 0;}
总结
通过以上内容,可以了解 SDL 的基本使用方法及其相关功能。从环境搭建到多线程开发,SDL 为开发者提供了强大的多媒体开发工具,广泛应用于游戏、媒体播放等领域。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月12日 02时55分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
windows环境下生成ssh keys
2019-03-04
2019年一个程序员的回顾与成长计划
2019-03-04
CSDN博客自定义栏目——Google、百度、必应站内搜索框
2019-03-04
vue 双项绑定的实例 货币转换
2019-03-04
vue if else用法。
2019-03-04
a标签提交表单
2019-03-04
vue 官方实例教程 markdown demo
2019-03-04
CSS border-style 属性
2019-03-04
Python数据类型 列表、元组、集合、字典的区别和相互转换
2019-03-04
宝塔配置404 502页面
2019-03-04
jquery each 操作批量数据
2019-03-04
Mac OS X 下 su 命令提示 sorry 的解决方法
2019-03-04
vue-router 缓存路由组件对象
2019-03-04
移动端 触摸事件和mousedown、mouseup、click事件之间的关系
2019-03-04
js中事件捕获和事件冒泡(事件流)
2019-03-04
js的各种数据类型判断(in、hasOwnProperty)
2019-03-04
严格模式、混杂模式与怪异模式
2019-03-04
一篇文章带你搞定 Java 中字符流的基本操作(Write / Read)
2019-03-04
HTML 和 CSS 简单实现注册页面
2019-03-04
(Java)让枚举实现一个接口
2019-03-04