
2026 年从零做一款 N64 游戏:phoboslab 的完整实战路线
知名独立开发者 phoboslab 用 C 重写自己的 JS 游戏引擎,做出了自 2002 年以来第二款实体发行的全新 N64 游戏。这篇教程覆盖硬件、工具链、模拟器、真机调试和发行全流程。
原文来源:How to Make a Nintendo 64 Game in 2026(phoboslab.org) — 从引擎移植到实体卡带发行,完整记录一款现代 N64 游戏的诞生过程
先说结论:2026 年做一款 N64 游戏,不但可行,而且工具链已经成熟到"用几个晚上就能把引擎跑起来"的程度。知名独立开发者 Dominic Szablewski(phoboslab,js13kGames 创办人)刚发布了 Xibalba 64——一款 Wolfenstein 3D 风格的 FPS,由 Modretro 发行实体卡带,配合他们的现代 N64 复刻主机 M64 一起卖。这是 N64 商业生命结束后,第二款全新制作的实体发行游戏(第一款是 2023 年的 Xeno Crisis)。这篇文章就是他的完整实战记录。
起点:两年前埋下的伏笔
phoboslab 的故事要从 2010 年说起。他当时开发了 Impact,一个专为 2D 动作游戏设计的 JavaScript 游戏引擎,处理瓦片地图、精灵、碰撞检测这些基础能力。2024 年,他"没有理由地"把 Impact 用 C 重写了一遍——纯粹的乐趣驱动。这个 C 移植版叫 high_impact,设计上带一个"平台后端"抽象:平台层负责打开窗口、创建绘制表面、读取输入这些底层活。开箱自带 SDL2 和 Sokol 两个平台后端,渲染后端也是模块化的——软件渲染、OpenGL、Metal 任选。
正是这个"平台后端 + 渲染后端"的双重抽象,让 N64 移植变得可行:加一个新的平台后端,不用动引擎任何其他部分。
—— 广告 ——
N64 硬件:一台古怪的机器
N64 是一台怪机器。除了 93MHz 的 MIPS CPU(还是大端的!),它有两个协处理器:
- RDP(Reality Display Processor):固定功能图形处理器
- RSP(Reality Signal Processor):可编程向量处理器,负责图形和声音
两个都封装在同一块芯片里,统称 RCP(Reality Coprocessor)。
N64 生命周期的头几年,Nintendo 严格看管着 RSP 的访问权,只有官方平台库 libultra 能用。后来才允许游戏工作室为 RSP 写自定义"微码"(其实就是 MIPS 汇编)。RDP 的指令古怪复杂,直接在裸机上编程基本不可能。虽然这些年 libultra 泄露到了网上,但用它有版权诉讼风险。
好在 N64 的 homebrew 社区这几年发展迅猛,现在有了一个非常能打的替代品:Libdragon。它本质上就是"N64 的 SDL"——提供画精灵和三角形、声音输出、手柄输入等全套设施。phoboslab 只花几个晚上,就给 high_impact 写了一个基于 Libdragon 的平台后端。
开发环境:模拟器 + 烧录卡 + 真机
编译工具链:Libdragon 自带编译器和其他一切构建 ROM 所需的东西,文档完整,示例丰富。一个提醒:用 preview 分支,别用"稳定"的 trunk 分支——后者已经严重落后了。
模拟器:N64 模拟器长期以来精度感人。早期模拟器大多只是模拟 Nintendo 的平台库 libultra——它们模拟的是"画三角形的意图",而不是硬件真正会做什么。如今 Ares 的 N64 核心已经非常接近真实硬件,RDP 和 RSP 都完整模拟,连 RSP 的精确时序都有。但 N64 著名的内存带宽瓶颈,只能在真机上测试。
真机调试:你需要一台真 N64 和一张能跑任意 .z64 ROM 的烧录卡。开源的 SummerCart64 很优秀,注意别买 AliExpress 上偷工减料的板子。它的亮点是有 USB-C 口:可以直接连电脑,用 sc64deployer 把 ROM 上传作为构建流程的一部分。
phoboslab 的最终配置是:N64 放电脑旁边走 USB 连接,花 10 美元买了个 USB 模拟采集卡把视频输出显示在桌面窗口里(Linux 下用 mpv 调低延迟)。这样"真机迭代"就是编译一下、按一下 N64 的重启键的事。
引擎改造:2D 引擎跑 3D 游戏
high_impact 是 2D 引擎,但 Xibalba 64 是 3D 游戏——不过它没有高度差,所以可以"大部分当作 2D 处理":物理、移动、射击逻辑全都按 2D 跑,跟 Wolfenstein 3D 非常像。从概念上说,你可以从 2D 俯视角玩这款游戏。
引擎里很多物理函数接受 vec2_t 参数,但绘制需要 3D 位置。phoboslab 用了一个漂亮的 C 技巧——union:
typedef struct {
float x, y;
} vec2_t;
typedef union {
vec2_t xy;
struct {
float x, y, z;
};
} vec3_t;
typedef struct {
// ...
vec3_t pos;
vec3_t vel;
// ...
} entity_t;需要调用接受 vec2_t 的函数时,可以"免费"从 vec3_t 转换:
trace_t res = trace(collision_map, entity->pos.xy, entity->vel.xy);由于内嵌的 vec3_t struct 是匿名的,所有字段仍然可以直接访问——entity->pos.z 照常工作。既保留了 2D 物理的接口,又拿到了 3D 坐标,零额外开销。
已有关卡和敌人类型的移植大约两周就完成了,之后又花了几个月扩展游戏内容(更多关卡、敌人、武器)和优化渲染器。Libdragon 的大部分函数能自然融入新的平台/渲染后端,只有两处需要绕开:high_impact 自带的混音器(Libdragon 有自己的,由 RSP 加速)和图像加载器。
关卡编辑器:单文件 HTML + 热重载
整个开发过程中,phoboslab 一直保留着用 SDL2 或 Sokol 后端构建游戏的能力,方便在桌面端测试游戏逻辑和敌人行为。他还给关卡编辑实现了热重载机制——关卡文件一变,游戏立刻更新。
关卡编辑器是 high_impact 自带的,单个自包含 HTML 文件。他为 Xibalba 64 扩展了不少:更好的光照贴图支持、显示实体实际精灵(而不是方块)、实体设置描述等。
发行:给现代 N64 复刻机做实体卡带
游戏做好之后,phoboslab 直接给 Modretro 的公开客服邮箱发了邮件,第二天就收到了出版负责人的回复。合同直接了当,他要求了一些修改——允许他之后把游戏引擎开源——Modretro 爽快答应了。
开发后期他才收到预生产的 M64 主机,但这没关系:M64 按宣传的那样工作,游戏不需要为它做任何改动。盒绘有朋友帮忙(这位朋友 90 年代负责过 Sierra 在德国的很多游戏包装,包括《半条命》),手册由他提供文字和插图、Modretro 排版印刷。
销售数字和合同细节不方便公开,游戏刚发售几天,"目前看起来相当不错"。phoboslab 的原话是:做 N64 游戏大概不能让你辞职,但看起来能让你支付几次不错的假期。
想入坑?这些资源收藏好
- n64.dev:N64 开发相关一切资源的合集
- N64brew Discord:非常友好活跃的社区,很多库开发者都在
- Libdragon:N64 系统库首选
- Tiny3D:简单快速的 3D 图形库
- Pyrite64:可视化关卡编辑器,用于创建 3D 游戏
为什么这件事值得关注
抛开情怀,这条路线图展示了一个很实际的模式:模块化引擎 + 成熟 homebrew 工具链 + 复古硬件发行渠道,让独立开发者能够以极低成本进入一个完全没有竞争的细分市场。N64 商业生命周期结束 20 多年后,物理卡带发行市场重新开张了——而做这个市场的人,比做 Steam 独立游戏的人少了好几个数量级。如果你对游戏开发感兴趣,与其在红海里卷,不如去 N64brew 社区逛逛,说不定下一个实体卡带就是你的。
© 2026 四月
原文链接:https://www.aprilzz.com/tutorials/make-n64-game-2026-guide
相关文章
用 C 语言实现 Go 风格的并发:goroutine 与 channel 的原理与手写实现
深入浅出地讲解 Go 语言 goroutine 和 channel 的底层原理,并用 C 语言结合 POSIX 线程从零实现一个简化版的并发模型
保持 Agentic AI 简单:AGENTS.md + Agent Skills + 规格驱动的实用工作流
比利时开发者 Tim Deschryver 用一个月时间让 AI Agent 从零重写整个项目,本文拆解他的完整工作流:AGENTS.md 统一上下文、Agent Skills 按需加载、OpenSpec 规格驱动开发,以及如何用符号链接让不同工具共享同一套配置。
一台 GPU 能塞下多少个开发者?自托管 LLM 的实测数据与成本账
imec 团队用 64 个真实编程任务测试了 4 套自托管方案:DGX Spark 只够 1 个人用,单张 H200 能带 32 个并发会话,8 张 B200 才能跑近前沿模型但并发反而更少。买 GPU 到底划不划算?答案取决于你的利用率。