# SDL 3.4 发布：一次让跨平台开发更顺手的升级（视频笔记）

> 把视频要点整理成文章，并结合 SDL 3.4.0 官方更新：GPU 与 2D 渲染互操作、原生 PNG、Emscripten 与输入支持等，让跨平台开发更省心。

- Author: Charliefoo
- Published: 2026-01-10
- Last modified: 2026-01-10
- Canonical: https://foo-z.com/blog/others14-sdl-3-4-bilibili-intro/
- Category: 它山之石
- Tags: 游戏开发, SDL, SDL3, 跨平台, 图形渲染

> 有些技术更新，第一次看到标题会觉得“又是小版本迭代”；但点开看完才发现，它解决的都是日常开发里最磨人的那类问题：依赖、兼容、以及“为什么这台机器能跑那台不能”。

最近我刷到一支关于 SDL 3.4 的解读视频（8 分钟左右），节奏很快，但信息密度也很高。更难得的是，它没有停在“功能清单”这一层，而是把这些变化会怎么影响日常开发讲清楚了。

我自己看完之后做了两件事：先把视频里提到的要点按主题整理成文章，再对照 SDL 3.4.0 的官方 release notes，把容易“听个大概”的地方落到“到底新增了哪些接口/能力”。

视频链接：<https://www.bilibili.com/video/BV18kiZBiECJ/>
官方更新（SDL 3.4.0）：<https://github.com/libsdl-org/SDL/releases/tag/release-3.4.0>

## 一句话总结：我为什么会关注这次更新

如果我只允许自己记住三件事，那就是：

- **GPU 与 2D 渲染互操作更顺**：我更容易把 UI/2D 渲染接到 GPU 管线里。
- **原生 PNG 支持**：我在常见图片加载/保存场景里，可以更少依赖外部库。
- **Web/输入继续补齐**：我做跨平台时，Emscripten、笔/触控、控制器支持都更接近“能交付”。

视频里提到的主线，在官方说明里也能对得上，而且细节比“更强了”要更清晰。

## SDL 是什么：我为什么总会在关键时刻想到它

SDL（Simple DirectMedia Layer）在我眼里更像一层跨平台地基：窗口、输入、音频、事件循环……不同系统细节很多，但 SDL 把它们收束成统一接口。

所以当我需要“先跑起来”，或者要面对多平台（桌面 + Web + 移动端）时，SDL 往往就是那个稳的选择。

## 我把视频要点整理成一份可用清单

### 1) 图形：GPU 与 2D 渲染更好互操作（我最在意）

视频里强调了 GPU 与 2D 渲染互操作。我之所以在意，是因为很多项目最终都会走到“2D UI + GPU 管线”并存的阶段；接口割裂会让工程体验变脆。官方 release notes 把这件事落到了更具体的能力上：

- `SDL_CreateGPURenderer()` / `SDL_GetGPURendererDevice()`：可以创建一个“为 GPU 渲染服务”的 2D renderer。
- `SDL_CreateGPURenderState()`、`SDL_SetGPURenderStateFragmentUniforms()`、`SDL_SetGPURenderState()`：让 GPU 2D renderer 可以用片元着色器等能力。
- 2D texture 与 GPU texture 的互通：通过 texture properties 可以从现有 GPU texture 创建 2D texture，也能反过来取出 GPU texture。
- GPU 2D renderer 也补齐了不少“真会用到的 2D 场景”：例如 YUV/HDR colorspace、调色板纹理、9-grid tiled 渲染、像素风缩放等。

对我来说，这类更新的价值不在“多了一个 API”，而在于：我的渲染架构不用为了 UI/贴图/像素风等需求被迫割裂。

### 2) 原生 PNG：我终于可以少装一个依赖

视频里说“原生 PNG 终于来了”。我关心的不是“有没有 PNG”，而是“能不能少引一个库、少一层打包/兼容风险”。官方说明给出的边界非常明确：

- `SDL_LoadPNG()` / `SDL_LoadPNG_IO()`：加载 PNG。
- `SDL_SavePNG()` / `SDL_SavePNG_IO()`：保存 PNG。
- `SDL_LoadSurface()` / `SDL_LoadSurface_IO()`：自动检测 **BMP 与 PNG** 并加载成 surface。

这意味着：如果我的项目只需要 PNG（以及顺手带上 BMP），SDL 现在就能直接覆盖一部分需求。

但它并不等于“替代 SDL_image”。如果我需要支持更多格式（jpg/webp/gif…）或更完整的图像处理链路，SDL_image 依然更合适。

### 3) 输入与设备：我更希望“默认就能用”

视频里提到控制器支持（包括 Steam 控制器这一类生态）。我对输入系统的期待一直很朴素：别让我为了少数设备写一堆补丁。官方 release notes 也能看到输入设备的持续增强：

- 增强了多种控制器支持（例如 8BitDo、FlyDigi 等），并补充了 HID 设备属性关联接口。
- 进一步完善了笔输入：例如 `SDL_GetPenDeviceType()` 用于区分笔是在屏幕上还是在独立触控板上。
- 还新增了 pinch 手势相关事件（begin/update/end），对触控设备更友好。

这部分看起来像“零散修修补补”，但对我这种要发布/要适配的人来说非常关键：越多设备默认可用，我就越少被兼容性反馈拖住节奏。

### 4) Web（Emscripten）：我更希望它像“应用”而不是“demo”

视频也提到了 Emscripten 支持改进。我一般会把 Web 端的风险点放在“窗口/输入是否正常”和“能否稳定适配”上。官方说明里能看到更具体的落点：

- `SDL_WINDOW_FILL_DOCUMENT` / `SDL_SetWindowFillDocument()`：窗口填充浏览器窗口。
- 可以设置/查询 Canvas ID、键盘输入绑定元素等创建属性。

Web 端的问题经常不是“能不能跑”，而是“能不能稳定地跑、能不能像一个正常应用一样跑”。这类更新往往会在我真正上线/适配时体现价值。

## 我会顺手记下的“小但实用”的更新

除了视频强调的三条主线，SDL 3.4.0 还有一些很工程向的增强，我自己会顺手记一下（通常这种小功能，最后用得最多）：

- `SDL_SCALEMODE_PIXELART`：更适合像素风的缩放算法，尽量避免糊。
- `SDL_RenderTexture9GridTiled()`：9-grid 支持 tiled 渲染（不是拉伸）。
- Windows/Linux 的任务栏进度：`SDL_SetWindowProgressState()` / `SDL_SetWindowProgressValue()`。

## 我用一个很小的“从视频到代码”的对照收尾

原生 PNG 这件事，落到代码层其实就这么直白：

```c
SDL_Surface *surface = SDL_LoadPNG("foo.png");
SDL_SavePNG(surface, "out.png");
```

以及更“懒人”的：

```c
SDL_Surface *surface = SDL_LoadSurface("foo.png"); /* 自动识别 PNG/BMP */
```

当“更新卖点”能这样直接落在函数名上时，我的迁移与试用成本就会很低。

---

> 💡 如果你也在用 SDL：你现在最痛的点是什么？是渲染、输入，还是打包/依赖？我可以按你的方向，再补一篇“我会怎么升级到 3.4.0”的实践清单（从哪些点开始试、可能踩哪些坑）。
