Gamedev in Zig is actually pretty good (2025)
摘要
Zig 语言在游戏开发中表现出色,凭借与 C 的无缝互操作和精细内存控制,适合底层控制偏好的开发者。尽管语言尚年轻,存在 LSP 弱、文档不全等问题,但 2025 年已值得尝试。
<p><a href="https://lobste.rs/s/y23kkm/gamedev_zig_is_actually_pretty_good_2025">Comments</a></p>
查看缓存全文
缓存时间: 2026/07/11 21:28
### TL;DR
Zig 凭借与 C 的无缝互操作、精细的内存控制和简洁的构建系统,在游戏开发中表现出色,尤其适合偏爱底层控制而不想被 C++ 复杂特性困扰的开发者。尽管语言还很年轻(0.13 版本),存在 LSP 弱、文档不全等问题,但已值得在 2025 年认真尝试。
---
## 为什么 Zig 适合游戏开发
Zig 是一门底层、高性能的系统级语言,给你更精细的控制:你自己分配和释放内存,还能通过特殊的分配器(甚至自己写)来指定如何分配。没有隐藏的内存分配,也没有隐藏的控制流。没有运算符重载,因为你可能不想用 `+=` 就在堆上分配内存——这更符合游戏开发中对性能可预测性的需求。
更重要的是,Zig 能无缝地与 C 代码互操作,基本上你在 Zig 里编程就能用任何你想用的 C 库。这意味着你可以直接使用成熟的 C 游戏库(如 raylib、SDL、sokol),无需编写胶水代码或忍受复杂绑定。
---
## raylib-zig:最顺滑的入门方式
对大多数人来说,**[raylib-zig](https://github.com/Not-Net/raylib-zig)** 正是你需要的。它是一组非常薄的 raylib C 库绑定,可以轻松用在任何 Zig 项目里。虽然你也可以直接在 Zig 项目里使用 raylib,但用这个更省心,尤其是设置起来更方便。
### 设置步骤
1. **安装 Zig**
下载 zig 安装包或使用包管理器,例如 macOS 上用 Homebrew:
```bash
brew install zig
```
2. **创建项目**
```bash
mkdir youtube-raylib-example && cd $_
zig init
```
这会生成 `build.zig`、`build.zig.zon`、`main.zig` 和 `root.zig`。
3. **添加 raylib 依赖**
前往 raylib-zig 仓库,复制添加依赖的命令并粘贴到终端,它会自动更新 `build.zig.zon`。
然后打开 `build.zig`,粘贴从 raylib-zig 复制过来的代码段——先获取依赖和模块,再链接库并添加导入路径。
4. **编写代码**
清空 `main.zig`,写入:
```zig
const rl = @import("raylib");
pub fn main() void {
rl.initWindow(800, 600, "Zig raylib example");
defer rl.closeWindow(); // 利用 Zig 的 defer 自动清理
while (!rl.windowShouldClose()) {
rl.beginDrawing();
rl.clearBackground(rl.Color.skyBlue);
rl.endDrawing();
}
}
```
5. **运行**
```bash
zig build run
```
第一次构建会编译 raylib,之后就会看到一个天蓝色窗口。
> 用 Zig 搭建项目比用 C 简单得多——C 需要手动从源码构建、配置库和环境,再丢给 CMake 或 Makefile。Zig 的构建系统抽象了这些,但你仍然拥有绝对控制权。你可以直接查看 raylib-zig 的 `build.zig`,看到他们做的事情跟你自己写的一样,没有黑魔法。
---
## 其他值得关注的库
### SDL3(fork)
有一个基于 Zig 构建系统的 SDL3 fork,它其实就是 SDL3 仓库,但切换成了 `build.zig`。把它加入你的项目就像两个命令一样简单,可以立即使用最新版 SDL3(录制视频那天刚发布)。
### sokol + sokol-zig
**[sokol](https://github.com/floooh/sokol)** 是一个头文件风格的 C 库(类似 stb),用于制作跨平台游戏。它根据操作系统使用不同的图形 API(macOS 用 Metal,Linux 用 OpenGL,Windows 用 DirectX),抽象掉了平台相关代码。
不过让项目在不同平台上构建一直是个痛点,直到 **[sokol-zig](https://github.com/floooh/sokol-zig)** 出现——由 sokol 作者维护,让你能无缝使用 sokol,在所有平台上都能工作,无需记忆不同系统的编译命令。
### zig-gamedev
一个用于 Zig 游戏开发的库集合,包含音频、glfw、数学库,甚至有自己的 sdl2/sdl3。缺点:它们追踪 Zig 的 nightly 构建,而官方发布版 0.13.0 暂时无法编译它们。如果你愿意用 nightly,这是一个宝藏。
### Mach 引擎
类似 Bevy 的 ECS 驱动引擎,非常全面,文档不错,正在积极开源开发中。如果你从 Rust 背景过来、想用 ECS 做游戏,值得留意。
---
## 作者的个人项目:两天搭建的小引擎
作者花了两天时间用 Zig 写了一个小型引擎,用于做物理模拟。运行 `zig build run` 后能看到一个带天空盒的螺旋线演示,GUI 设置简单(可调整摄像机 FOV、添加速度等)。用 Zig 工作的体验比直接写 C 好得多——在 C 里你可能还得自己写动态数组,而在 Zig 中一切都很顺手。
作者总结:从直接使用 C 到使用带有许多现代好处的 C(但又不像 C++ 那样什么都往里塞),这是一个非常好的升级。
---
## Zig 的不足之处
### LSP 体验不佳
Zig 的 LSP 非常欠缺。例如删掉结构体一个字段后,代码中还在使用该字段,LSP 不会报错,只有颜色变化,导致在 Neovim 中没有“跳转到错误”功能,直到运行构建命令才暴露问题。相比之下,Rust 的 LSP 会没完没了地抱怨每一个潜在问题。
### 文档不完整
尤其构建系统是近期变动较多的部分之一,有些特性在文章中读到后却发现实际不存在、名字不同或位于完全不同的结构体中。需要自己深入挖掘才能解决。不过总体遇到的大问题不多。
---
## 总结
尽管 Zig 还很年轻(0.13 版本),不稳定,东西会变,需要准备修改代码库,但它作为系统编程领域里非常酷的语言,在 2025 年已经展现出巨大的潜力。如果你愿意尝鲜,并接受一些粗糙的边角,用 Zig 写游戏会是一个非常愉快的体验。
**Source:** [Gamedev in Zig is actually pretty good (2025) - YouTube](https://www.youtube.com/watch?v=-xIFpg7sBVs)
相似文章
How is Zig working out after 3 years and 100k lines of game code?
经过3年、10万行Zig代码的游戏开发实践,Zig作为游戏逻辑层与C++引擎混用表现出轻量高效的开发体验,尽管语言尚未稳定,但积极变化远大于不便。
为什么我在2024年用Zig编写了一个Game Boy Advance游戏
一位开发者解释了为什么他们选择Zig编程语言来创建Game Boy Advance游戏,强调了Zig的交叉编译能力及其对嵌入式编程的适用性。
Zig 示例教程
通过带注释的示例,对 Zig 编程语言进行实践性介绍,涵盖从基础到高级的主题。灵感来源于 Go by Example。
重返Zig
作者描述了从Zig到Rust再回到Zig的历程,探讨了编程语言中稳定性与表达力之间的权衡。
Zig 示例
Zig by Example 是一本 Zig 编程语言的实践入门教程,包含针对版本 0.16 的带注释的示例程序。