假期无聊想着搞一个 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 1
|
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
lbyo 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 文件的格式。
|