Homebrew Hub 的浏览器内模拟功能是怎么实现的?

Homebrew Hub 的浏览器内模拟,靠的是把三款开源模拟器编译成 WebAssembly,再嵌进网页里运行。你在条目页面点运行,实际是在浏览器里启动一个 mGBA(Game Boy / Game Boy Color、Game Boy Advance)、binjnes(NES)或 binjgb(Game Boy)的 WebAssembly 版本,ROM 数据由页面加载后交给这个模拟器执行,画面和声音输出到网页上的画布与音频接口。适用条件是:你的浏览器支持 WebAssembly,且该条目在库中已有可运行的 ROM 文件;不需要在本地安装任何模拟器。

三款模拟器分别负责什么

Homebrew Hub 没有自己写模拟器,而是复用了三个成熟项目,按平台分工:

模拟器 负责平台 说明
mGBA Game Boy、Game Boy Color、Game Boy Advance 覆盖 GB/GBC/GBA 三档
binjgb Game Boy 另一款 GB/GBC 模拟器
binjnes NES 负责 NES 平台

网站的说法是使用这些模拟器的 WebAssembly 构建,提供“无缝且准确”的浏览器内模拟能力。也就是说,模拟精度取决于上游模拟器本身,Homebrew Hub 做的是编译、集成和加载。

为什么用 WebAssembly

WebAssembly 是一种浏览器可执行的二进制指令格式,性能接近原生代码,同时被主流浏览器支持。把 C/C++ 写的模拟器编译成 WebAssembly 后:

  • 模拟器核心逻辑以接近原生的速度运行,足以支撑实时模拟;
  • 不需要用户安装插件或本地程序;
  • 同一份编译产物可以在不同操作系统和浏览器上运行。

这正是“不下载本地模拟器也能体验条目”的技术前提。

一次运行大致经过哪些环节

  1. 打开条目:在 Homebrew Hub 搜索或浏览到某个 Game Boy、GBA 或 NES 自制软件条目。
  2. 触发模拟:页面加载对应的 WebAssembly 模拟器模块,并把该条目的 ROM 数据读入内存。
  3. 执行与输出:模拟器解释执行 ROM 指令,把视频帧绘制到网页画布,把音频送到浏览器的音频输出。
  4. 交互:键盘或页面上的虚拟按键把输入事件传给模拟器,模拟器再转成对应平台的按键状态。

预期结果是:条目直接在页面内跑起来,无需离开浏览器。若条目没有可用的 ROM 文件,或浏览器不支持 WebAssembly,则无法运行——这是最常见的卡点。

和本地模拟器的区别

  • 便利性:浏览器内运行省去下载、安装、配置 BIOS 和手柄的步骤,适合快速试玩和浏览。
  • 可控性:本地模拟器通常提供更多选项,如存档管理、金手指、画面滤镜、加速与回放。Homebrew Hub 的定位是“在浏览器里直接体验”,不是替代完整的本地模拟器。
  • 数据来源:浏览器内运行依赖网站提供的 ROM 与元数据;本地运行则由你自己管理文件。

这套模拟和网站的其他部分是什么关系

Homebrew Hub 是一个社区主导的归档项目,目标是收集、保存 Game Boy(Color)、Game Boy Advance 和 NES 上的自制软件与 demoscene 作品,数据库当前有 1629 条条目。模拟只是它的一种呈现方式,和另外两块能力并列:

  • 数字保存:抢救并持续收集 90 年代以来的非官方软件;
  • 开放可审计:数据库维护在公开 git 仓库(分 Game Boy、GBA、NES 三个),元数据遵循定义好的 JSON schema,数据集以宽松许可证发布,任何人都能贡献和审查。

所以浏览器内模拟不是孤立功能,而是建立在“条目 + ROM + 元数据”这套开放数据之上的体验层。

使用前需要知道的条件

  • 需要支持 WebAssembly 的现代浏览器;
  • 需要该条目在库中有可运行的 ROM;
  • 模拟精度由 mGBA、binjgb、binjnes 决定,不同平台、不同作品的兼容表现可能不同;
  • 网站页面提供 API、源代码、sitemap 等入口,想了解数据或参与贡献可以从这些入口进入。
hh.gbdev.io