SDL3

SDL即Simple DirectMedia Layer,类似DirectX,是完整的游戏、多媒体开发包,但不同的是它跨越几乎所有的平台,有各种语言的接口,多种语言的文档,而这一切都是广大志愿者完成的。目前扩展部分还没有正式的文档,以下为核心部分文档的向导部分。

主要架构

SDL 的全部工作就是「把平台差异挡在下面,给你一套统一函数」。所以它的架构是纵向切开的四层:

SDL3 分层架构 自上而下:你的应用、SDL3 公共 API 层、子系统层、后端驱动层,最后落到操作系统与硬件。 你的应用(C / C++) SDL3 运行库(libSDL3 / SDL3.dll) 公共 API 层 统一的 SDL_* 函数,头文件按子系统拆分 子系统层 Video · Audio · Events · Input · Threads · Timer · IO · GPU … 后端驱动层 win32 · cocoa · X11 · Wayland · KMSDRM · Android · iOS · Emscripten 操作系统 / 硬件

驱动层是运行时选的,不是编译器写死,SDL_Init(SDL_INIT_VIDEO)会按照优先级探测,windows上先试d3d/dxgi再试win32;linux平台上先试wayland、x11、kmsdrm。可以通过SDL_HINT_VIDEODRIVER或者环境变量SDL_VIDEODRIVER=x11来强制制定。

子系统是可以裁剪的,静态编译的时候可以关掉不需要的模块比如不编译音频、手柄,这个是sdl可以塞进switch、ps2、机顶盒这类设备的原因。

纵向是「层次」,横向是「功能块」。SDL3 的头文件就是它的模块清单,一个头文件对应一个子系统:

SDL3 子系统分组 四个分组:显示与渲染、音频、输入、基础设施。高亮的是入门最先接触的模块。 显示与渲染 Video Renderer GPU Camera 音频 Audio Stream Audio Device WAV 加载 格式转换 输入 Events Keyboard/Mouse Gamepad Haptic/Sensor 基础设施 Threads Timer IOStream Properties

几块正式模块(对应 include/SDL3/ 下的头文件):

组头文件干什么
视频SDL_video.h窗口、显示器、HiDPI、全屏、OpenGL/Vulkan/Metal/D3D 上下文
渲染SDL_render.h2D 绘制:纹理、矩形、线段、旋转、裁剪
GPUSDL_gpu.h新增。跨后端 3D/计算,一套 API 跑 Vulkan / Metal / D3D12 / WebGPU
事件SDL_events.h事件队列,是所有输入的入口
输入SDL_keyboard.h / SDL_mouse.h / SDL_gamepad.h / SDL_joystick.h / SDL_pen.h / SDL_sensor.h键鼠、手柄(统一映射)、压感笔、陀螺仪
音频SDL_audio.h设备枚举 + SDL_AudioStream(播放/录音流)
线程SDL_thread.h线程、互斥量、信号量、原子操作
IOSDL_iostream.h / SDL_filesystem.h / SDL_asyncio.h替代 stdio 的统一读写;异步 IO 是新增
系统SDL_timer.h / SDL_properties.h / SDL_log.h / SDL_dialog.h / SDL_camera.h计时、属性系统、日志、文件对话框、摄像头(新增)

还有一批「冷门但真能用」的:SDL_messagebox.h(原生弹窗)、SDL_clipboard.h、SDL_tray.h(托盘图标,新增)、SDL_power.h(电量)、SDL_locale.h、SDL_process.h

入手顺序

SDL3 上手路径 四步递进:先搭窗口和事件循环骨架,再用 Renderer 绘制,然后接入音频,最后按需选一个方向深入。 1 开窗口 + 事件循环 SDL_Init → SDL_CreateWindow → while (SDL_PollEvent) 2 用 Renderer 画东西 SDL_CreateRenderer → SDL_RenderTexture → SDL_RenderPresent 3 接入音频 SDL_OpenAudioDeviceStream + 回调里往流里写采样 4 选一个方向深入 GPU API / Gamepad / Camera / 线程池 / 自定义平台后端

继续更新