
假期无聊想着搞一个 NES 模拟器玩玩,目标在浏览器中运行,断断续续搞了一个月之后基本五脏俱全了,声音和图像都没啥大问题
github 地址:tsnes
在线演示地址:tsnes-demo
当初做模拟器的时候网上也找不到完整的入门教程,所以干脆就自己抽空慢慢更新教程了:NES 模拟器开发教程
模拟器效果图:
重装机兵 
Mario1 
我的 18 款 MBP i7 CPU,在 Chrome 中运行 CPU 占用大概 70%,所以理论上 i5 应该也可以全速模拟。
另外由于音频和绘图也会占用不少 CPU,所以如果采用 Web worker 将模拟器的线程分离出去,理论上在手机中应该也能全速模拟
由于我是以库的形式进行开发的,所以没有花心思美化页面(~~主要还是懒~~)
1 zhuawadao 2020-04-06 13:57:30 +08:00 别让楼主灰心,支持一下~ |
2 Mohanson 2020-04-06 13:59:58 +08:00 |
3 lzdyes 2020-04-06 14:20:05 +08:00 厉害了! |
4 yuuko 2020-04-06 14:24:32 +08:00 厉害了 |
5 anUglyDog 2020-04-06 14:39:33 +08:00 强 |
6 anUglyDog 2020-04-06 14:40:49 +08:00 你这做好看点可以引流啊,太有情怀了 |
7 idealhs 2020-04-06 14:47:00 +08:00 挺好奇,为什么如此低性能的一个机器,浏览器的模拟器跑起来这么吃资源啊 |
8 GPLer 2020-04-06 14:50:56 +08:00 @idealhs 模拟本身就有性能损失,更不用说用的是脚本语言,执行效率本身就不高,原始的机器性能虽然低,但好歹利用率高,性能浪费的少。 |
9 LukeChien 2020-04-06 15:09:45 +08:00 via Android 好像见过 WebAssembly 做的,那个性能会好一些,楼主同样 |
10 zj 2020-04-06 15:25:43 +08:00 这个要支持下。 |
11 across 2020-04-06 15:25:46 +08:00 看了文档还没写到显示部分,是用 webgl 画? |
13 renmu 2020-04-06 15:37:49 +08:00 via Android 我不当勇士了,我要回家修战车 |
15 esw OP @idealhs NES PPU 时钟 5MHZ 以上,也就是说模拟的时候每秒要执行 500w 以上次运算,而且每次运算需要很多逻辑来完成,再加上 JS 性能损耗,所以比较费 CPU |
17 firefox12 2020-04-06 15:57:39 +08:00 很牛逼 我想问是不是要把 cpu ppu 系统本身全模拟出来 再做? |
18 esw OP @firefox12 我是找一些简单的或者自己写的测试程序,然后一点一点开发,不需要一下子全模拟好,在不熟悉所有硬件行为的情况下也不现实 |
19 firefox12 2020-04-06 16:08:20 +08:00 @esw 但是 没有模拟 cpu 和 ppu 你怎么让卡带里的内容跑起来? 我的看法 是读卡带文件 ,然后让模拟 cpu 开始运行里面的二进制,然后让结果显示出来吧。 |
20 zwxharry 2020-04-06 16:13:30 +08:00 重装机兵回忆杀,红狼,尼娜 |
21 esw OP @firefox12 对,首先开发 CPU,使用 http://nickmass.com/images/nestest.nes 来开发,它有 log 可以对照: http://www.qmtpro.com/~nes/misc/nestest.log ,这样就可以一条指令一条指令地开发,同时用 log 来检测错误,最终整个文件正常运行完就说明 CPU 大部分工作开发完了,然后使用同样的方法,一点一点开发 PPU |
22 Arrowing 2020-04-06 17:10:24 +08:00 重装机兵好评,upupup |
23 Warder 2020-04-06 17:22:01 +08:00 很强,一个月就做好了啊 |
24 mengkun 2020-04-06 18:15:26 +08:00 太强了…… |
25 hive 2020-04-06 19:46:00 +08:00 收下我的膝盖 |
26 superliwei 2020-04-06 20:05:57 +08:00 很强。。。 |
29 Mohanson 2020-04-06 22:21:59 +08:00 @esw 哈哈, 我还写过雅达利街机的模拟器: https://github.com/mohanson/space-invaders, 这些游戏机因为没有操作系统所以模拟起来比较容易, 到 PS 时代后的机器就不好模拟了, 去年想过做 switch emu, 调研了一下就立马放弃了. |
30 Meltdown 2020-04-06 22:23:50 +08:00 via Android 膜拜 |
31 zhw2590582 2020-04-06 22:34:08 +08:00 可以大概说说怎么个原理吗 |
32 luny 2020-04-06 23:45:37 +08:00 学习了! |
33 Archeb 2020-04-07 08:02:09 +08:00 via iPhone 楼主! |
34 happy8109 2020-04-07 09:37:09 +08:00 实现个实时存盘吧 |
36 esw OP @zhw2590582 其实就是软件模拟 NES 里面芯片的逻辑,然后电信号变成函数调用 |
39 augustheart 2020-04-07 10:35:49 +08:00 @esw gba 啊,唯一一台主机发售前就让人给模拟了的游戏机…… |
40 UnknownR 2020-04-07 10:55:50 +08:00 卧槽,star 一个学习一下 |
41 eivs 2020-04-07 11:32:55 +08:00 |
42 wanguorui123 2020-04-07 14:16:26 +08:00 666 |
43 baxtergu 2020-04-07 16:50:46 +08:00 在 github 发现了这个仓库看了下代码,一开始以为是对 jsnes 的 ts 实现,后来发现好像不是。不过楼主厉害 一个月能做成这样,666 |
45 yun77op 2020-04-07 17:07:43 +08:00 厉害,可以尝试下用 assemblyscript 把 ts 转成 WebAssembly |
47 exceptionplayer1 2020-04-07 17:37:06 +08:00 真厉害,大佬 |
48 lneoi 2020-04-07 17:56:27 +08:00 厉害厉害 |
49 boks 2020-04-07 18:04:23 +08:00 牛逼,我最近刚好也想搞这个。 |
50 lights 2020-04-07 18:10:13 +08:00 重装机兵在国内真的好有名啊 |
53 nazhenhuiyi294 2020-04-08 09:55:18 +08:00 有点流批 |
54 uestcfei 2020-04-09 11:26:08 +08:00 这个是没有支持所有的 nes 格式的吗?我下载的有一些 nes 的游戏,运行提示:Unsupported mapper: 150,file 看了一下,没啥区别啊。和好奇这个 nes 文件的格式。 |