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

2018-01-23 11:10:20 +08:00
 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 以上 😀

11361 次点击
所在节点    分享创造
67 条回复
lneoi
2018-01-23 16:12:57 +08:00
这个可真的是会被告...
zjcqoo
2018-01-23 16:45:04 +08:00
@cy97cool 在考虑做个实时存档的,可以回滚到之前任何一帧,就跟拖动视频进度一样~

(原理也简单,只需记录每一帧的按键就可以。NES 里没有熵池,就算有随机数算法,估计也只跟种子和按键有关)
master13
2018-01-23 17:20:54 +08:00
厉害厉害!
fy
2018-01-23 17:40:46 +08:00
大概这就是大佬吧 膜拜
xi4ohz
2018-01-23 17:48:38 +08:00
同看了楼主的博客园,真的强!
winterbells
2018-01-23 18:29:03 +08:00
我只有 43290FPS /(ㄒoㄒ)/~~
zhouyou457
2018-01-23 18:55:46 +08:00
7p 只有 2338fps ……
woffee
2018-01-23 19:27:40 +08:00
好巧妙的方法
a570295535
2018-01-23 19:31:08 +08:00
一般屌,如果改成 [多人在线玛丽奥跑酷] 就真屌了
linap
2018-01-23 19:48:06 +08:00
s8+ 18200fps
pluto1
2018-01-23 20:07:25 +08:00
Safari 随手跑了一下只有 2600。。吓得我赶紧打开 Firefox 看了下,19W+ 。。还以为电脑已经落后时代那么多了 2333
ericFork
2018-01-23 20:12:34 +08:00
能不能把 I 和 O 键反过来……因为这个死了好多次了
yagnqionggo
2018-01-23 20:16:46 +08:00
太厉害了
abeholder
2018-01-23 20:19:56 +08:00
膜拜大佬 。
zenze
2018-01-23 20:56:58 +08:00
玩了好久,谢谢大佬!
kran
2018-01-23 21:11:49 +08:00
nes 图像是怎么做的?
morethansean
2018-01-23 21:25:42 +08:00
既然这个帖子变成了 benchmark ...
iPhoneX: 2570
Pixel 2: 18522
为啥差距这么大...
zjcqoo
2018-01-23 21:30:13 +08:00
@ericFork 刚刚加了一个 Swap AB 的选项。我也经常纠结这个顺序 😂
zjcqoo
2018-01-23 21:33:59 +08:00
@pluto1
@morethansean 现在整个游戏逻辑最终在一个 JS function 里,函数越大优化开销是指数上升的。有些浏览器快是因为支持 asm.js ,它有专门的优化策略,和普通 JS 不太一样。

以后会考虑拆成多个小 function,这样性能会提高很多。
zjcqoo
2018-01-23 21:44:36 +08:00
@kran 图像是 CHR 数据通过 PPU 渲染出来的。(可以想象 WebGL 里纹理通过 GPU 渲染出图像)

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

https://www.v2ex.com/t/425155

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

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

© 2021 V2EX