WATaBoy:Game Boy 指令即时编译为 Wasm,性能超原生解释器 1.2 倍!

发布时间:2026/7/1 19:22:56

WATaBoy:Game Boy 指令即时编译为 Wasm,性能超原生解释器 1.2 倍! WATaBoy将 Game Boy 指令即时编译为 Wasm 性能超越原生解释器发布于 2026 年 6 月 28 日背景本文假设读者熟悉即时编译的概念。Dolphin 模拟器无法在 iOS 上运行原因在于 iOS 不支持即时编译这是 OatmealDome 在博客文章中给出的简要解释。读了那篇文章后作者一直在思考要让像 Dolphin 这样依赖 CPU 的模拟器在 iOS 上运行需要怎么做难道只能等待几年等 iPhone 的 CPU 性能足够强大能通过解释器运行 Dolphin 吗不过苹果对即时编译的限制有一个例外那就是网页浏览器。JavaScriptCore 在高性能层级会使用即时编译WebAssembly 也是如此。那么能否利用这一点不直接生成本地机器代码而是生成 Wasm 字节码最终由网页浏览器编译成本地机器代码呢阅读了 Andy Wingo 的博客文章后作者意识到这是可行的。事实上已经有一些项目采用了这种技术但截至撰写本文时还没有游戏主机模拟器使用这种技术也没有人将其性能与原生运行的解释器进行对比。因此作者在本科毕业设计中决定开发一个 Game Boy 模拟器先使用解释器然后使用即时编译为 Wasm 的方式作为概念验证和基准测试比较这两种方法的性能。了解一些模拟器知识的读者可能会不屑一顾毕竟 Game Boy 模拟器怎么会从即时编译中受益呢幸运的是GameRoy 的博客文章详细解释了如何在保持周期准确的同时实现这一点。当然Game Boy 模拟器从即时编译中获得的好处不如第六代游戏机模拟器那么多但开发一个 Game Boy 模拟器速度更快也更符合作者毕业设计的范围。实现作者将带你了解 WATaBoy 中最具通用性、且在其他地方找不到指南的部分在 Rust 中进行 Wasm 代码生成和后期链接。通常会使用一些工具来生成 Rust 和 JavaScript 之间的粘合代码但这些工具在处理底层 Wasm 时会带来一些使用上的问题。因此作者采用了类似于相关文章中描述的方法。提醒一下需要使用 Rust 的夜间版因为稍后会使用一些内联 Wasm 代码。创建一个新的库后尝试在运行时生成一些执行相同操作的 Wasm 字节码。Wasm 代码生成wasm - encoder 库将是唯一的依赖项借助它可以使用构建器模式来生成 Wasm 指令的字节码。现在用它来生成一个包含 add 函数的 Wasm 模块的字节码。那么如何实际执行这些字节码呢编译和链接Wasm 采用的是哈佛架构不能直接执行程序生成的字节码必须借助嵌入器通常是 JavaScript来编译、实例化并链接新的 Wasm 字节码。假设已经导入了一个名为 linkNewModule 的函数稍后会在 JavaScript 中实现这个函数。接下来实现调度函数以调用间接函数表中的第 n 个函数。将上述内容整合起来代码如下。最后需要通过 build.rs 文件向 LLVM 链接器传递两个标志。好了Rust 部分的工作完成了构建主 Wasm 模块。嵌入器JavaScript部分尝试从嵌入器调用 make_and_execute_add 函数发现控制台输出错误原来是还没有实现链接函数。现在来实现它再次运行代码控制台输出正确结果。这就是 WATaBoy 的代码生成、链接和调度的基础。结果比较 WATaBoy 的在 Wasm 中运行的即时编译器、在 Wasm 中运行解释器以及原生运行解释器的性能。在基准测试中三种模式都被设置为加载游戏的只读存储器并以无帧率限制的速度模拟循环的标题画面持续 10 秒的实际时间。测试的三个 ROM 分别是《宝可梦 蓝》《塞尔达传说林克的觉醒》和《Tobu Tobu Girl》。结果以 10 秒内模拟的总帧数来衡量。给出了基准测试环境的详情。每个基准测试配置都运行了 5 次Wasm 基准测试在没有其他标签页打开的网页浏览器中进行每次运行后都会刷新运行基准测试的标签页。将模拟的总帧数取平均值然后除以 Game Boy 的刷新率得到相对速度。在模拟《宝可梦 蓝》时即时编译为 Wasm 的方法比原生运行的解释器快约 1.2 倍也比在 Wasm 中运行的解释器快约 1.5 倍。还在三大主流浏览器引擎上运行了基准测试看来 Safari 领先了。基于网页的好处之一是可以直接在博客文章中提供演示但运行速度太快可能会引发光敏性癫痫患者的癫痫发作所以在点击开始之前请务必小心。后续工作WATaBoy音频和 Game Boy Color 支持是最明显的缺失功能。在性能方面模拟图像处理器仍然占据了 WATaBoy 大部分的运行时间因为还有一些 PPU 中断没有实现预测功能导致即时编译器比实际需要的更频繁地回退到解释器。即时编译为 Wasm 的方法明显优于原生运行的解释器但只是证明了基本块即时编译器优于基本的取指 - 解码 - 执行解释器。解释器已经很快了并且花了很多时间对其进行优化但仍然有一些小众的优化技术可能会帮助它赶上基本块即时编译器。优化即时编译器也是如此。作者认为进一步优化后比较它们的相对性能会很有趣计划将这个项目作为一个爱好继续下去。即时编译为 Wasm 技术目前即时编译为 Wasm 的主要痛点在于代码生成。为了让这种技术得到更广泛的应用模拟器开发者可能希望有一种方法可以编写人类可读的 WebAssembly 文本格式字符串并在编译时将其转换为字节码。这种方法还有另一个局限性无法实现 Dolphin 依赖的一些底层优化。结论这并不一定能证明仅仅通过实现即时编译为 Wasm 的方法GameCube 模拟器就能全速运行。但鉴于即使是基本块即时编译器也能超越解释器这是一个值得探索的方向。希望随着代码生成工具的不断成熟Wasm 能够成为跨平台游戏机模拟器实现更快速度的常用目标特别是在 iOS 上。可以使用自己的 ROM 来尝试 WATaBoy 的完整版本。它的主要亮点在于其精妙的实现细节而非设计。

相关新闻