当前位置: 首页 > news >正文

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 的完整版本。它的主要亮点在于其精妙的实现细节,而非设计。

http://www.jsqmd.com/news/1104360/

相关文章:

  • KMX63与PIC18LF47K42实现高效人机交互技术解析
  • OECP性能优化秘籍:如何提升大规模ISO对比效率10倍
  • Linux 线程的 “马甲“ 哲学:LWP 内核真身与 pthread 库的封装艺术
  • 揭秘openEuler/CCA:ARM机密计算架构如何彻底改变数据安全?
  • openEuler RISC-V SIG:构建环境配置与依赖解析完全指南
  • 韩国投 1 万亿美元扩大芯片生产与研发人形机器人,力争 2028 年实体 AI 领先并商业化机器人
  • 【Istio实战】Istio 服务网格生产级指南:核心架构、流量管理、安全策略与多集群部署
  • Unique3D深度解析:单图生成高质量3D网格的架构解密与实战指南
  • RT-Thread 完全笔记 —— STM32F103 标准库移植与实现
  • 仓储管理的关键点是什么,库存周准确率公式是怎么的?
  • 工业 DC-DC 模块电源硬件选型解析:钡特电源 VF1-24S24S 与 WRF2424S-1WR2 规格、封装、工况适配全维度拆解
  • 2026Word文件压缩至10M以内完整实操指南
  • 好玩局联合阅彩城打造银川首届汉堡节 滩羊汉堡成为现场人气爆款
  • 如何在conda-ecopkgs中查找和安装HPC软件包:abinit、3d-dna等实战指南
  • 信号白化是什么?原理、作用和实现,以及对自适应滤波器的好处
  • 基于Si4732与STM32的高性能数字收音机设计
  • Reflective Prompting:人机对话的镜像工程方法论
  • 闭环智控:利用AI算法动态修正碳带分切偏移与毛刺问题
  • 杰理之软关机会重启【篇】
  • 杰理之LL 编解码格式后会一直复位【篇】
  • Codex++ 管理多个 Codex 配置方案
  • 工业堆焊未来发展趋势,智能化精密化绿色化成主流
  • Kiran-Qt5-Integration核心组件揭秘:QPlatformTheme与QStyle插件架构详解
  • EM3080-W与PIC18F87J10的条形码识别系统设计
  • 基于PHP、asp.net、java、Springboot、SSM、vue3的高校线上考试系统的设计与实现-计算机专业毕业设计选题题目
  • conversation-pipeline
  • 【AI项目经理实战指南】
  • Plex检测试剂盒如何实现多因子同步分析?
  • 【毕业设计】信息化在线教学平台 SpringBoot+Vue 完整源码(含论文+数据库,可运行)
  • novelWriter 终极指南:如何用开源工具完成你的第一本小说创作