F-Zero X 反编译项目移植 Nintendo 3DS,v1.0.0 支持 Old 3DS 与 64DD 扩展包
F-Zero X on Nintendo 3DS
F-Zero X 反编译项目 G-Diffuser 发布 Nintendo 3DS 移植版 v1.0.0,从同一源码树产出 Old 3DS、New 3DS 及带 64DD 扩展包的 New 3DS 三个构建。
01 · 概览
3DS 上的 F-Zero X——新旧机型原生支持,含 64DD 扩展套件
将 G-Diffuser(F-Zero X 反编译项目)移植到 Nintendo 3DS 的复盘——v1.0.0,涵盖最初 24 天的冲刺(2026-08-11 至 09-03),让它在 New 3DS 上以 60 fps 立体 3D 运行;以及为期 43 天的第二阶段(2026-09-07 至 10-19),新增 Old 3DS 支持、原生渲染器和扩展套件。全程由一人主导;一个长期存活的 Claude 会话负责编排;147 个子代理构建了第一阶段,更多子代理完成了第二阶段。
主机从黑屏变成了原生 60 帧的立体竞速游戏,又从仅支持 New 3DS 的构建变成了覆盖两款主机、含与不含 64DD 扩展的四向发布。
59.6fps
硬件实测中位数,完整大奖赛,New 3DS,第一阶段结束时(首场模拟器比赛时为 12–20 fps)
51.4fps
30 台机器同场时的第十百分位下限,第一阶段(从 25–35 提升)
53%
帧率达到 60 上限的比例,第一阶段(一周前为 14%)
15
第一阶段 24 个日历日中的活跃天数,因每周计划额度用尽而暂停三次
3.17 B
所有会话和代理的 token 总量,仅第一阶段;见成本
$4,974
按公开 API 标价(Fable 每百万 token $10/$50,1 小时缓存写入),仅第一阶段;见成本
250
第一阶段中涉及 3DS 移植的提交数,于 2026-10-08 从 v0.9.0 文档冻结——未对照最终历史重新核实
15,039
port/3ds 下的代码行数,外加 48 个纯增量补丁,第一阶段计数
v1.0.0 新增内容
3
从同一源码树发布的三个主机构建:Old 3DS、New 3DS,以及带扩展套件的 New 3DS
199
第二阶段期间编写的内部进度笔记
43 天
第二阶段的日历跨度,2026-09-07 至 10-19(含首尾)
上方卡片数据有日期。第一阶段的硬件数据和 token/成本数字截至 2026-09-03 测得,未针对 v1.0.0 重新运行;代理工作流页面描述了第二阶段的运行方式,成本页面明确说明了它计价和不计价的内容。
硬件实拍
以下片段和照片来自 v0.9(2026-09),当时 DASH 尚未取代下屏的调试控制台。
构建内容
从同一源码树发布的三个主机构建,均可从 HOME 菜单(.cia)或自制程序启动器(.3dsx)启动:面向 Old 3DS / 2DS 和 New 3DS / New 2DS XL 的基础游戏,以及带 64DD 扩展套件(赛道编辑器和机器创建器,可使用用户自备的磁盘镜像游玩)的 New 3DS 构建。所有构建都从 SD 卡读取预烘焙的资源归档——游戏本身从不附带 ROM 或磁盘镜像。
他们跑通了整个游戏:大奖赛、计时赛、练习赛、死亡竞赛,以及机器编辑器界面,音乐和音效都跑在真实的 DSP 上,立体 3D 由滑块控制,下屏仪表盘提供三种 HUD 布局和比赛外的待机视图,HOME 挂起、恢复、关闭、合盖休眠和关机都干净利落。New 3DS 版本保持了第一阶段达到的原生 60 帧节奏;Old 3DS 版本则通过另一条路径达到相近的结果。在 v1.0.0 下,不带 ini 时,两个版本都默认走同一条路径:原生渲染器([perf] preset = auto)。New 3DS 第一阶段的渲染线程/逐绘制立体路径仍然内置,并可通过显式 ini 启用,但已不再是默认——两个版本的并排对比见 Frontier 和 Pushing the boundaries。
技术栈
- decomp:F-Zero X 反编译(inspectredc/fzerox),上游未改动,外加一个补丁栈。
- libultraship:N64 运行时(Kenix3),上游未改动,包含一处 13 行的 newlib 修复,使其能在 devkitARM 上构建;它仍然绘制所有菜单和非比赛画面。
- port/3ds:截至第一阶段为 15,039 行,此后继续增长:citro3d 渲染后端、立体、音频、输入、菜单、生命周期、渲染线程、性能分析器、打包。
- 原生渲染器(第二阶段加入):一个自有的解释器,对比赛几何体跳过逐帧显示列表遍历,是两台主机上 v1.0.0 的默认路径——它如何做到、以及为何它能让 Old 3DS 跟上,见 Frontier。
硬件上的头条数字,第一阶段(New 3DS)
| 时间 | 中位数 | p10 | 达到上限 |
|---|---|---|---|
| 08-14 首场比赛(模拟器) | 12–20 | – | – |
| 08-21 首次硬件运行 | 48–50 | – | – |
| 08-28 发布级构建 | ~51 | ~40(人群,MINIMAL) | – |
| 09-02 第 1 轮:战役前的主线 | 51.3 | 39.2 | 9% |
| 09-02 第 2 轮:桥接备忘(brfast) | 57.2 | 46.6 | 29% |
| 09-02 第 3 轮:HUD 图集 · 三角形备忘 · TMEM · 音频 | 56.0 | 48.0 | 32% |
| 09-02 第 4 轮:核心 2 上的渲染线程(pipe) | 57.6 | 44.6 | 14% |
| 09-03 第 5 轮:Ahead 模式 · 主线程上的桥接 · 自动对手细节 | 59.6 | 51.4 | 53% |
第一阶段的五句话
- 08-11 → 08-14:从研究到一场比赛。可行性档案、智能体团队计划、五条并行基础流、六个启动 bug、模拟器中首场比赛 12–20 fps。
- 08-20 → 08-22:从粉色到可玩,再到真机。雾、HUD、涂装、阴影、天空修复;loadblock 的发现让菜单从 27 fps 提升到 60 fps;08-21 首次硬件运行(“哇,跑得惊人”);当晚音频搞定。
- 08-27 → 08-28:产品级。五智能体舰队投放、立体启用、触摸菜单、对手细节、GPU 顶点变换的登月计划构建后搁置、带法律声明的 README、发布包。
- 09-01 → 09-02:生命周期和最后一个大杠杆。HOME 崩溃和从 HOME 关闭卡死修复;桥接输出缓存被证明是 NO-GO,改为对每个子显示列表的分类做备忘,而不是每帧重新扫描;LOCKED-60 战役启动,四条并行杠杆。
- 09-02 → 09-03:多核。渲染线程放到核心 2、提前一帧模式、主线程上的桥接、自动 LOD;中位数 59.6,53% 的帧达到上限;崩溃修复;视口放置修复;立体标记锚定。
第二阶段的六句话
原本不在计划内;它从 09-07 跑到 10-19,共 43 个日历日。
- 09-07 → 09-29:先界定范围,再让它装得下。 此前已被放弃的 Old 3DS 里程碑重新启动;多个并行代理将构建塞进其 64 MB 应用区域(RDRAM 竞技场减半、音频改为流式而非常驻、纹理上传设上限);2026-09-29,在真实 Old 3DS 上的首次硬件会话中,已发布的(New-3DS 时代、16 MiB RDRAM)构建在启动时崩溃,而为适配该主机内存配额构建的
-DGDX_3DS_O3DS=ON配置则成功启动,并在同一会话中以约 10 fps 运行比赛。 - 09-29 → 09-30:找出真正的开销。 收窄的音频锁将 Old 3DS 上比赛墙的等待每帧减少约 20 ms;跳帧终结了游戏意外的慢动作;首个保留模式渲染器在模拟器中大获成功,但在硬件上几乎没改变数字。
- 09-30 → 10-01:改变计划的探针。 硬件性能计数器显示真正的限制是指令缓存未命中,而非指令数量。构建了一个姿态回放回退方案并成功运行,随后按用户决定搁置:“我们应该追求真正的 60!我仍然相信这一定可能。”
- 10-01 → 10-02:原生渲染器。 围绕缓存而非指令数量重建,每个比赛类别一个小循环,大小适配 16 KB 指令缓存。2D 大奖赛比赛的中位帧时间达到 16.5 ms。
- 10-03 → 10-08:Old 3DS 上也能 3D 60。 带独立交换节奏模式的逐眼重新提交在大多数大奖赛赛道上于 3D 下达到 59–60 fps;最重的赛道(Silence、Sand Ocean)仍可能在比赛中途触发跳帧安全网,降至稳定的 30 fps。
- 10-08 → 10-19:扩展包、仪表盘与发布。 64DD 扩展包在原生渲染器下逐 tick 验证一致,并在 Old 3DS 上启动,但随后证明其太慢而无法在该平台发布;下屏 DASH 发布;在 v1.0.0 发布前,一个常设对抗性审查审计了合并结果。
关于第二阶段如何运行,见 Agentic workflow;关于完整战役的逐卡详情,见 Old 3DS。
继续阅读
- 作者注:唯一由人类撰写的一页。
- 每一步:从 New 3DS 到 v1.0.0 的时间线。
- 通往 60 之路:New 3DS 性能战役,逐轮记录。
- 原生分支:它为何存在,以及它改变了什么。
- Old 3DS:在 268 MHz 上通往真正 60 的道路。
- 突破边界:对比我们的 New 3DS 构建,也对比同类作品。
- 困难:哪些问题在抵抗,以及如何被击败。
- 前沿:这个移植做到了同处境的其他作品尚未做到的事。
- Agentic workflow:舰队如何运行,航向如何把握。
- 成本:Token、美元、子代理。
这些页面上的每个数字都有来源:git 历史、docs/research/ 下的研究文档、硬件日志,或 Cost 页面统计的会话记录。若某值为估算(美元数字,即把已公布的 API 标价应用于精确 token 数),其假设会在旁边注明。
来源:Hacker News · hypnotize.works