用 Typescript 写了个 NES 模拟器

2020-04-06 13:48:21 +08:00
 esw

假期无聊想着搞一个 NES 模拟器玩玩,目标在浏览器中运行,断断续续搞了一个月之后基本五脏俱全了,声音和图像都没啥大问题

github 地址:tsnes

在线演示地址:tsnes-demo

当初做模拟器的时候网上也找不到完整的入门教程,所以干脆就自己抽空慢慢更新教程了:NES 模拟器开发教程

模拟器效果图:

重装机兵

Mario1

我的 18 款 MBP i7 CPU,在 Chrome 中运行 CPU 占用大概 70%,所以理论上 i5 应该也可以全速模拟。

另外由于音频和绘图也会占用不少 CPU,所以如果采用 Web worker 将模拟器的线程分离出去,理论上在手机中应该也能全速模拟

由于我是以库的形式进行开发的,所以没有花心思美化页面(~~主要还是懒~~)

7438 次点击
所在节点    分享创造
55 条回复
zhuawadao
2020-04-06 13:57:30 +08:00
别让楼主灰心,支持一下~
Mohanson
2020-04-06 13:59:58 +08:00
lzdyes
2020-04-06 14:20:05 +08:00
厉害了!
yuuko
2020-04-06 14:24:32 +08:00
厉害了
anUglyDog
2020-04-06 14:39:33 +08:00
anUglyDog
2020-04-06 14:40:49 +08:00
你这做好看点可以引流啊,太有情怀了
idealhs
2020-04-06 14:47:00 +08:00
挺好奇,为什么如此低性能的一个机器,浏览器的模拟器跑起来这么吃资源啊
GPLer
2020-04-06 14:50:56 +08:00
@idealhs 模拟本身就有性能损失,更不用说用的是脚本语言,执行效率本身就不高,原始的机器性能虽然低,但好歹利用率高,性能浪费的少。
LukeChien
2020-04-06 15:09:45 +08:00
好像见过 WebAssembly 做的,那个性能会好一些,楼主同样🐮🍺
zj
2020-04-06 15:25:43 +08:00
这个要支持下。
across
2020-04-06 15:25:46 +08:00
看了文档还没写到显示部分,是用 webgl 画?
across
2020-04-06 15:27:58 +08:00
@across 看了下 ppu 代码是纯手动画的啊,怪不得····
renmu
2020-04-06 15:37:49 +08:00
我不当勇士了,我要回家修战车
esw
2020-04-06 15:47:56 +08:00
@zhuawadao 谢谢!
esw
2020-04-06 15:51:30 +08:00
@idealhs NES PPU 时钟 5MHZ 以上,也就是说模拟的时候每秒要执行 500w 以上次运算,而且每次运算需要很多逻辑来完成,再加上 JS 性能损耗,所以比较费 CPU
esw
2020-04-06 15:53:11 +08:00
@across 目前是 PPU 生成 RGB 点阵数据直接扔给 canvas 画图和缩放,只不过都在一个线程完成了
firefox12
2020-04-06 15:57:39 +08:00
很牛逼 我想问是不是要把 cpu ppu 系统本身全模拟出来 再做?
esw
2020-04-06 16:03:21 +08:00
@firefox12 我是找一些简单的或者自己写的测试程序,然后一点一点开发,不需要一下子全模拟好,在不熟悉所有硬件行为的情况下也不现实
firefox12
2020-04-06 16:08:20 +08:00
@esw 但是 没有模拟 cpu 和 ppu 你怎么让卡带里的内容跑起来? 我的看法 是读卡带文件 ,然后让模拟 cpu 开始运行里面的二进制,然后让结果显示出来吧。
zwxharry
2020-04-06 16:13:30 +08:00
重装机兵回忆杀,红狼,尼娜

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

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

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

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

© 2021 V2EX