首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
esw
V2EX  ›  分享创造

用 Typescript 写了个 NES 模拟器

  •  4
     
  •   esw · 99 天前 · 4187 次点击
    这是一个创建于 99 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    github 地址:tsnes

    在线演示地址:tsnes-demo

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

    模拟器效果图:

    重装机兵 p1

    Mario1 p2

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

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

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

    55 条回复    2020-04-11 12:20:23 +08:00
    zhuawadao
        1
    zhuawadao   99 天前
    别让楼主灰心,支持一下~
    lzdyes
        3
    lzdyes   99 天前
    厉害了!
    yuuko
        4
    yuuko   99 天前
    厉害了
    anUglyDog
        5
    anUglyDog   99 天前
    anUglyDog
        6
    anUglyDog   99 天前
    你这做好看点可以引流啊,太有情怀了
    idealhs
        7
    idealhs   99 天前
    挺好奇,为什么如此低性能的一个机器,浏览器的模拟器跑起来这么吃资源啊
    GPLer
        8
    GPLer   99 天前
    @idealhs 模拟本身就有性能损失,更不用说用的是脚本语言,执行效率本身就不高,原始的机器性能虽然低,但好歹利用率高,性能浪费的少。
    LukeChien
        9
    LukeChien   99 天前 via Android
    好像见过 WebAssembly 做的,那个性能会好一些,楼主同样🐮🍺
    zj
        10
    zj   99 天前
    这个要支持下。
    across
        11
    across   99 天前
    看了文档还没写到显示部分,是用 webgl 画?
    across
        12
    across   99 天前
    @across 看了下 ppu 代码是纯手动画的啊,怪不得····
    renmu
        13
    renmu   99 天前 via Android
    我不当勇士了,我要回家修战车
    esw
        14
    esw   99 天前
    @zhuawadao 谢谢!
    esw
        15
    esw   99 天前
    @idealhs NES PPU 时钟 5MHZ 以上,也就是说模拟的时候每秒要执行 500w 以上次运算,而且每次运算需要很多逻辑来完成,再加上 JS 性能损耗,所以比较费 CPU
    esw
        16
    esw   99 天前
    @across 目前是 PPU 生成 RGB 点阵数据直接扔给 canvas 画图和缩放,只不过都在一个线程完成了
    firefox12
        17
    firefox12   99 天前
    很牛逼 我想问是不是要把 cpu ppu 系统本身全模拟出来 再做?
    esw
        18
    esw   99 天前
    @firefox12 我是找一些简单的或者自己写的测试程序,然后一点一点开发,不需要一下子全模拟好,在不熟悉所有硬件行为的情况下也不现实
    firefox12
        19
    firefox12   99 天前
    @esw 但是 没有模拟 cpu 和 ppu 你怎么让卡带里的内容跑起来? 我的看法 是读卡带文件 ,然后让模拟 cpu 开始运行里面的二进制,然后让结果显示出来吧。
    zwxharry
        20
    zwxharry   99 天前
    重装机兵回忆杀,红狼,尼娜
    esw
        21
    esw   99 天前
    @firefox12 对,首先开发 CPU,使用 http://nickmass.com/images/nestest.nes 来开发,它有 log 可以对照: http://www.qmtpro.com/~nes/misc/nestest.log ,这样就可以一条指令一条指令地开发,同时用 log 来检测错误,最终整个文件正常运行完就说明 CPU 大部分工作开发完了,然后使用同样的方法,一点一点开发 PPU
    Arrowing
        22
    Arrowing   99 天前
    重装机兵好评,upupup
    Warder
        23
    Warder   99 天前
    很强,一个月就做好了啊
    mengkun
        24
    mengkun   99 天前
    太强了……
    lbyo
        25
    lbyo   99 天前
    收下我的膝盖
    superliwei
        26
    superliwei   98 天前
    很强。。。
    esw
        27
    esw   98 天前
    @Warder 不算完全做好,nes mapper 太多了,简直就是无底洞,目前只完成了一些常用 mapper
    esw
        28
    esw   98 天前
    @Mohanson 学习了!
    Mohanson
        29
    Mohanson   98 天前
    @esw 哈哈, 我还写过雅达利街机的模拟器: https://github.com/mohanson/space-invaders, 这些游戏机因为没有操作系统所以模拟起来比较容易, 到 PS 时代后的机器就不好模拟了, 去年想过做 switch emu, 调研了一下就立马放弃了.
    Meltdown
        30
    Meltdown   98 天前 via Android
    膜拜
    zhw2590582
        31
    zhw2590582   98 天前
    可以大概说说怎么个原理吗
    luny
        32
    luny   98 天前
    学习了!
    Archeb
        33
    Archeb   98 天前 via iPhone
    楼主🐮🍺!
    happy8109
        34
    happy8109   98 天前
    实现个实时存盘吧
    esw
        35
    esw   98 天前
    @Mohanson 是啊,资料太少,其他主机基本都没有 nesdev 这样全的网站了
    esw
        36
    esw   98 天前
    @zhw2590582 其实就是软件模拟 NES 里面芯片的逻辑,然后电信号变成函数调用
    esw
        37
    esw   98 天前
    @happy8109 存盘已经实现了,现在每 3 秒保存在 localstorage 里面
    esw
        38
    esw   98 天前
    @happy8109 刚看错了,才反应过来你说的是实时存档,这个确实还没搞
    augustheart
        39
    augustheart   98 天前
    @esw gba 啊,唯一一台主机发售前就让人给模拟了的游戏机……
    UnknownR
        40
    UnknownR   98 天前
    卧槽🐂🍺,star 一个学习一下
    eivs
        41
    eivs   98 天前
    这个感觉更流程一些

    https://github.com/bfirsh/jsnes
    wanguorui123
        42
    wanguorui123   98 天前
    666
    baxtergu
        43
    baxtergu   98 天前
    在 github 发现了这个仓库看了下代码,一开始以为是对 jsnes 的 ts 实现,后来发现好像不是。不过楼主厉害 一个月能做成这样,666
    sivacohan
        44
    sivacohan   98 天前
    @Mohanson 我支持了一个小额赞助~
    yun77op
        45
    yun77op   98 天前
    厉害,可以尝试下用 assemblyscript 把 ts 转成 WebAssembly
    Mohanson
        46
    Mohanson   98 天前
    @sivacohan 天啦噜, 这是我收到过最大的一笔赞助费! 谢谢老板(认真
    exceptionplayer1
        47
    exceptionplayer1   98 天前
    真厉害,大佬
    lneoi
        48
    lneoi   98 天前
    厉害厉害
    boks
        49
    boks   98 天前
    牛逼,我最近刚好也想搞这个。
    lights
        50
    lights   98 天前
    重装机兵在国内真的好有名啊
    esw
        51
    esw   98 天前
    @eivs jsnes 之前看过源码,不过 es5 看得脑阔疼
    esw
        52
    esw   98 天前
    @yun77op js 的动态特性不一定能转把?
    nazhenhuiyi294
        53
    nazhenhuiyi294   97 天前
    有点流批
    uestcfei
        54
    uestcfei   96 天前
    这个是没有支持所有的 nes 格式的吗?我下载的有一些 nes 的游戏,运行提示:Unsupported mapper: 150,file 看了一下,没啥区别啊。和好奇这个 nes 文件的格式。
    esw
        55
    esw   94 天前
    @uestcfei 没有,nes 有几百种 mapper,大部分 mapper 逻辑都是不同的,所以要全支持的话相当于要实现上百颗芯片的逻辑,这是非常耗时耗力的,所以目前只支持了任天堂官方几个常用的 mapper 和重装机兵的 mapper:mapper 0-4,mapper 74
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3131 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:46 · PVG 19:46 · LAX 04:46 · JFK 07:46
    ♥ Do have faith in what you're doing.