Retro Boy:用 Rust 编写的简单 Game Boy 模拟器,可在 Web 上运行
smparsons/retroboy
一个用 Rust 编写的 Game Boy 模拟器。你可以在 Web 上玩它。点击这里尝试。
简介
Retro Boy 是一个使用 Rust 编写的、周期精确的 Game Boy 模拟器。它使用 wasm-pack
将 Rust 代码转换为 WebAssembly,使其可以在 Web 上运行。Web 前端使用 Web Audio API 和 HTML Canvas 来处理音频和图形。它还利用浏览器的本地存储来持久化卡带 RAM 数据,以支持带电池的 MBC 卡带。
功能
-
精确的 CPU,通过了所有的 JSON CPU tests
-
精确的音频模拟
-
使用基于扫描线的渲染器构建的图形模拟
-
支持 MBC1、MBC3、MBC5 和 HuC1
-
支持 MBC3 卡带的 RTC
-
卡带 RAM 持久化到浏览器本地存储,支持带电池的卡带
-
支持 GameShark 或 GameGenie 作弊码
-
Web 前端支持:
- 全屏模式
- 暂停/恢复
- 可选的单色或彩色模式
- 可定制的游戏控制键位映射
- 管理和启用/禁用游戏作弊码
- 移动设备友好的响应式设计
如何编译为 WebAssembly
要将实现编译为 WebAssembly,你需要先使用命令 cargo install wasm-pack
安装 wasm-pack
(如果尚未安装)。然后,运行 sh ./build-wasm.sh
来构建核心项目,并在 Web 前端目录中生成 JavaScript 绑定代码。
Web 前端
此模拟器的 Web 前端是一个使用 Material UI 设计的 React/TypeScript 应用程序,位于 frontends/web
文件夹中。UI 提供了加载 ROM 以及播放、暂停或重置模拟器的功能。它还提供了一个全屏模式。
要运行 Web 前端:
- 如“如何编译为 WebAssembly”部分所述,将 Rust 代码编译为 WebAssembly 并生成 JavaScript 绑定代码。
- 生成绑定代码后,它将被添加到
frontends/web/src/core
目录。 - 在
frontends/web
目录中运行yarn install
以安装所有依赖项。 - 在同一目录中运行
yarn start
以在本地运行应用程序。
截图
测试 ROM
此模拟器通过了 Blargg 测试 ROM 集合中的以下测试套件:
此外,此模拟器通过了所有 JSON CPU tests,以及来自 Mooneye test ROM collection 的部分测试。
测试套件
该项目包含一个相当广泛的测试套件,因为大部分逻辑都是使用 TDD 方法设计的。有很多测试用于执行 CPU 操作码,以及执行 GPU 的基本测试。运行 cargo test
来运行测试套件。
有用的资源
为了方便起见,以下是我用于构建此模拟器的资源列表: