红白机游戏《超级玛丽》重编译成 JavaScript 代码

2018 年 1 月 23 日
 zjcqoo

周末在 GitHub 上看到有人把原版的《超级玛丽》汇编加上了详细的注释: https://gist.github.com/1wErt3r/4048722,差不多算是开源了吧:)

于是想起之前捣鼓的一个玩具 《机器指令翻译成 JavaScript 》,做了一些改进,加上了 NES 的接口,例如图像、声音、手柄等。

然后和之前文中说的一样,将 6502 ASM 「翻译」成 C,然后再通过 emscripten 「编译」成 JavaScript:

演示: https://www.etherdream.com/FunnyScript/smb-js/game.html

由于最新版的浏览器会把 asm.js 代码自动转成 WebAssembly,所以部分浏览器初始化比较慢,比如 Chrome 启动需要等好几秒。像 FireFox 会缓存 asm.js 的解析,所以只有首次加载会慢。


需要注意的是,这不是模拟器!最明显的特征,就是性能。

点击 Benchmark 按钮可测试游戏逻辑的极限 FPS,目前最快的是 Firefox,在我笔记本上可以跑到 19 万 FPS !就算 IE10 也能跑到 600 FPS。( IE10 以下的浏览器不支持)

当然,这还只是没做任何性能优化的结果,之后还会尝试更好的翻译方案,比如指令层的 call/jump 尽可能翻译成代码层的函数调用、分支代码等。希望能达到 50 万 FPS 以上 😀

12151 次点击
所在节点    分享创造
67 条回复
jonirrings
2018 年 1 月 23 日
兄弟干得不错啊。来看看这个 http://koute.github.io/pinky-web/
看看能不能把 Pixelated 加上
kran
2018 年 1 月 23 日
@zjcqoo 我没说清楚,本想问的是 nes 游戏图像数据是怎么获取到,然后渲染在网页上,是不是只需要读取显存就好了?
xx314327475
2018 年 1 月 23 日
打了一关 奖人还在熟悉的地方 谢谢作者
zjcqoo
2018 年 1 月 23 日
@kran 数据是从 NES 文件里提取出来的,打包在脚本里。(那 js 里一大坨 base64 的数据大部分都是图像数据)
kran
2018 年 1 月 23 日
@zjcqoo 打包的是贴图数据吧?动态的是怎么搞滴?

很奇怪,@ 没提醒
zgl2007dj
2018 年 1 月 23 日
666
zjcqoo
2018 年 1 月 23 日
@kran 可以看下原始的汇编程序: https://gist.github.com/1wErt3r/4048722 这里面包含了 指令+数据,贴图不在里面。我就是对照着翻译,并不关心动态数据是怎么产生的。
toan
2018 年 1 月 23 日
然后看了楼主博客的热文《一根网线发起的攻击》,哈哈哈,楼主真是牛,创新力,创造力,动手力真是个强!哈哈哈,服了!
killadm
2018 年 1 月 24 日
@toan 这篇文章以前看过,楼主在知乎发过?
cczy
2018 年 1 月 24 日
git 链接错了?
sammo
2018 年 1 月 24 日
好吃不腻
maemolee
2018 年 1 月 24 日
吊炸天啊这个 www
maemolee
2018 年 1 月 24 日
@cczy #49 去掉逗号和之后的部分
meanmachine
2018 年 1 月 24 日
既然都在 benchmark...s7e 4w
Creabine
2018 年 1 月 24 日
厉害了
Immortal
2018 年 1 月 24 日
厉害 不过更被楼主博客内容吸引
lizhenda
2018 年 1 月 24 日
真心厉害了
ariesjia
2018 年 1 月 24 日
太强大了 厉害厉害
doubleflower
2018 年 1 月 24 日
能自定义键就好了,这个 IO 太反人类了,建议 J 发子弹,K 跳
yesqu
2018 年 1 月 24 日
chrome 49969FPS

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/425155

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX