浏览器里可跑的 东方旧作? Dosbox-X Emscripten 化取得初步成功 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
yksoft1
V2EX    分享创造

浏览器里可跑的 东方旧作? Dosbox-X Emscripten 化取得初步成功

  •  3
     
  •   yksoft1 2018-09-14 15:52:39 +08:00 6835 次点击
    这是一个创建于 2653 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看这几天浏览器里的 DOS 游戏 挺火,我也跟风搞了一个类似的。

    其实就是根据 em-dosbox 对 dosbox 的第二种改法(用 Emterpreter 把主循环解释执行),把 Dosbox-X ( Dosbox 的一个支持 PC-98 模拟的 fork,我自己也 fork 了而且一直在跟)给弄到了 Emscripten 上。

    链接的时候有问题(用-O3 参数,asm2wasm 会挂掉,也不是内存爆了,估计触发了 bug ),用-O1 参数生成的 wasm,导致图形部分卡得要死( SDL2 没有生成优化版本)。只是刚好能看而已。

    其实昨天就搞定了类似之前的那个改 Dosbox 0.74-2 的,用暴力改 Dosbox-X 主循环为 Emscripten 主循环回调的版本,那个版本可以全优化,丝滑 60fps,但是一个瞬卡程序就可能跑飞,就可能把整个标签卡死在那里。这次没敢放出来。

    1 2 3

    demo 地址: https://yksoft1.github.io/dosboxxem-demo/

    应该不会把 100G 每月流量给打爆吧。。。

    第 1 条附言    2018-09-15 01:17:25 +08:00
    经过一些研究,不再用 cycles=max 而是固定在 12000 (修复了固定 cycles 功能)。现在 TH3 东方梦时空也能运行了。

    第 2 条附言    2018-09-18 22:35:31 +08:00
    演示视频已录。地址:
    https://www.bilibili.com/video/av31991198

    DOSBox-X:

    Neko Project 21 kai:
    37 条回复    2019-01-04 14:34:08 +08:00
    taikobo
        1
    taikobo  
       2018-09-15 10:13:09 +08:00
    性能太差了...
    drquest
        2
    drquest  
       2018-09-15 13:26:49 +08:00
    支持!流量的事情不是太用担心,有时间可以集成到 emularity 就可以利用 BrowserFS 加载 ZIP 档案了,这样游戏下载的流量就能少很多。
    nfroot
        3
    nfroot  
       2018-09-15 15:04:19 +08:00
    @terrytw 性能差么,我电脑倒是挺稳定快速,普通办公电脑
    yksoft1
        4
    yksoft1  
    OP
       2018-09-15 18:47:42 +08:00
    @drquest 其实只要把.wasm 和.data 在 HTTP 服务器上开 gzip 就能省了。.data 我存储的是完全不压缩的
    yksoft1
        5
    yksoft1  
    OP
       2018-09-15 18:49:13 +08:00
    @terrytw 请使用没有修复 meltdown/spectre 之前的 Chromium,或者高版本的 Firefox,速度会快很多
    yksoft1
        6
    yksoft1  
    OP
       2018-09-15 18:53:44 +08:00
    @drquest 不知道 DOS 下有没有什么快,而且压缩率高于 DEFLATE 的打包软件( ARJ、LZH 都不能满足要求)。可以在 Dosbox-X 内部直接解压,你有科学,我有神功
    discrete
        7
    discrete  
       2018-09-15 22:34:16 +08:00 via iPad
    性能挺好的啊,我在 iPad Pro 上都很顺
    yksoft1
        8
    yksoft1  
    OP
       2018-09-16 00:26:04 +08:00
    @discrete 但是只支持键盘啊。。
    drquest
        9
    drquest  
       2018-09-16 11:39:44 +08:00
    @yksoft1 如果从减少加载时间的角度看在 DOSBox 里解压缩很难划得来,因为 DOSBox 本身就比较慢。

    我简单的改了一下 emularity,这样就可以支持 DOSBox-X 了
    https://github.com/pengan1987/emularity
    修改过的代码只有一个 commit

    用 emularity 的好处还是挺多的,通过 BrowserFS 虚构出的文件系统,可以支持游戏存档,挂载 ZIP 包,虚拟机环境和游戏文件可以分开维护,每个游戏可以加载自己独立的 dosbox.conf,游戏文件放在 ZIP 里也相比 emscripten 的 data 文件更容易维护,多个游戏可以共用一份 wasm 和 js 文件,而且嵌入网页的代码也比较简明。

    这是个集成好的例子,FONT.ROM 和 YM2612 的声音单独挂载在另一个 ZIP 里,这样添加不同的游戏只要添加新的游戏 ZIP 文件包和 html 文件就可以,也比较容易通过服务器脚本动态生成。
    http://jsemu.oss-cn-shanghai.aliyuncs.com/pc98dosbox/pc98.html
    yksoft1
        10
    yksoft1  
    OP
       2018-09-16 12:02:53 +08:00
    @drquest
    我把我用的 TH1-5 给你。都被我手工修改过。
    https://drive.google.com/open?id=1rN7Qrok247gCRP5s0IGiQBhLZbnnoAH3

    另外这种办法貌似不错,我试试看。
    yksoft1
        11
    yksoft1  
    OP
       2018-09-16 13:33:10 +08:00
    @drquest 你有准备提交 PR 给 emularity 官方吗?
    drquest
        12
    drquest  
       2018-09-16 14:09:50 +08:00
    @yksoft1 所有的游戏都配好了,都可以玩,模拟器引擎的 JS 和 WASM 是共享的,FONT.ROM 和 YM2608 文件也是共享的( font.zip 加载到 Y 盘),DOSBox 优先从游戏压缩包加载,没有的话就用 font.zip 盘里的
    http://jsemu.oss-cn-shanghai.aliyuncs.com/pc98dosbox/th1.html
    http://jsemu.oss-cn-shanghai.aliyuncs.com/pc98dosbox/th2.html
    http://jsemu.oss-cn-shanghai.aliyuncs.com/pc98dosbox/th3.html
    http://jsemu.oss-cn-shanghai.aliyuncs.com/pc98dosbox/th4.html
    http://jsemu.oss-cn-shanghai.aliyuncs.com/pc98dosbox/th5.html

    是的,我准备提 PR 到 emularity 上游,这个项目是互联网档案馆 archive.org 模拟器功能的核心组件,如果 archive.org 那边更新了就可以上传 PC-98 软件到那边了。
    https://blog.archive.org/category/emulation/
    https://archive.org/details/software
    yksoft1
        13
    yksoft1  
    OP
       2018-09-16 18:24:34 +08:00
    @drquest 另外你在 twitter 上说 joncampbell123 的原 repo 没啥用,我的改动都在自己不规范 fork 的那个 repo 里面
    drquest
        14
    drquest  
       2018-09-16 18:36:13 +08:00
    @yksoft1 了解,当时 Jason 跟我要 original 的我就把 joncampbell123 的 repo 给他了,我后来在跟 Jason Scott 的私信和 IRC 里面留了你的 GitHub,你要能用 IRC 的话,到 EFnet 的#jsmess 频道,emularity 的维护者 db48x 也在里面。
    mytry
        15
    mytry  
       2018-09-17 11:35:25 +08:00
    github 的带宽又少又慢,只适合放比较小的加载器。大文件还是放在 CDN,或者把资源打包在图片里放到图床相册里吧~
    drquest
        16
    drquest  
       2018-09-17 15:26:24 +08:00
    我向 Emularity 提 PR 了,应该很快就会合并
    https://github.com/db48x/emularity/pull/42
    yksoft1
        17
    yksoft1  
    OP
       2018-09-17 15:31:18 +08:00
    @drquest 难。现在我那个 branch 都没有一个能用的 autotools 配置,只能靠那个 build_em.txt ,那帮洋人就怕他们编译不出来,直接说还不到合并的时机
    drquest
        18
    drquest  
       2018-09-17 16:11:47 +08:00
    @yksoft1 我倒是比较乐观,Jason Scott (@textfiles )是 Internet Archive 的历史学家,现在全职在推进这些事情。之前中华学习机 CEC-I 也是他们加进 MAME 主分支的。
    yksoft1
        19
    yksoft1  
    OP
       2018-09-17 16:15:29 +08:00
    @drquest 但是我可不想处理推到我 repo 里面来的 pr。。。自己改得太乱了,而且 Dosbox-X 本来就一团糟,无数没用的东西一直在里面
    drquest
        20
    drquest  
       2018-09-17 16:38:42 +08:00
    @yksoft1 其实这些模拟器项目差不多都是 fork 叠 fork 起来的,PCE 最早的 repo 是
    https://github.com/jsdf/pce

    然后四年没更新了,后来 http://retroweb.maclab.org/ 的主人更新了一版,加入了 Macintosh 的 Localtalk 支持和声音
    https://github.com/marciot/retroweb-pcejs-jsdf

    互联网档案馆里现在用的是这个 https://github.com/db48x/retroweb-pcejs-jsdf

    你开了这个头就已经是很大的贡献了。
    另外一个好消息就是今天早些时候 @TheMogMiner 把 SPARCstation 加入 MAME 里面去了,可以跑早期的 SunOS 了。
    yksoft1
        21
    yksoft1  
    OP
       2018-09-17 17:05:12 +08:00
    @drquest DOSBox 的发展历程是
    DOSBox 0.74 - DOSBox Daum (已经被弃坑)的某版本 - joncampbell123 接盘后,一顿乱改乱加,CPU 核心都改乱了 - 加入 PC-98 支持 - 现在的 DOSBox-X
    yksoft1
        22
    yksoft1  
    OP
       2018-09-17 17:12:25 +08:00
    @drquest 而且,我还在研究这个能不能 emscripten
    https://github.com/AZO234/NP2kai/
    现在程序已经可以在 emscripten 启动了
    yksoft1
        23
    yksoft1  
    OP
       2018-09-17 22:27:52 +08:00
    np2kai 跑是可以跑了,问题很多很多。。
    https://github.com/yksoft1/NP2kai/tree/emscripten
    yksoft1
        24
    yksoft1  
    OP
       2018-09-18 14:09:07 +08:00
    np21kai 的演示。跑得很慢,NP21 跑到 486 20mhz 都难。。
    https://yksoft1.github.io/np2kai-demo/np21kai.html
    @drquest
    drquest
        25
    drquest  
       2018-09-18 15:36:27 +08:00
    @yksoft1 厉害了!其实现阶段网页模拟器最好的也就跑到 Pentium 60 左右的速度,而且都不是完整模拟硬件的情况,V86 或者 jsLinux 差不多已经是上限了。
    yksoft1
        26
    yksoft1  
    OP
       2018-09-18 18:27:18 +08:00
    @drquest NP21 用的是 MAME 的 CPU,慢也没有办法。你按 CTRL+F11 呼出菜单了吗?
    yksoft1
        27
    yksoft1  
    OP
       2018-09-19 23:43:57 +08:00
    @drquest 感觉这两个模拟器的移植还有很多很多的 bug。不过我感觉需要他人的帮助来解决这些问题了
    drquest
        28
    drquest  
       2018-09-20 15:34:32 +08:00
    @yksoft1 我这里菜单可以打开,有什么需要特别注意的地方?
    yksoft1
        29
    yksoft1  
    OP
       2018-09-20 15:40:51 +08:00
    @drquest 不要点 exit,一点就会挂。然后 FDD HDD 可以打开文件了
    drquest
        30
    drquest  
       2018-09-21 15:13:53 +08:00
    @yksoft1 明白,emularity 主分支合并 DOSBox-X 的支持了
    yksoft1
        31
    yksoft1  
    OP
       2018-09-21 15:24:13 +08:00
    @drquest 我试了一下用 emularity 弄 np21kai,但是没有成功。似乎 emularity 里面把文件映射到 / 的方式对 np21kai 不适用。
    drquest
        32
    drquest  
       2018-09-23 14:45:29 +08:00
    @yksoft1 emularity 挂载文件系统的基础库是 browserFS
    https://github.com/jvilk/BrowserFS
    可以先尝试直接集成 BrowserFS,再尝试集成 emularity
    yksoft1
        33
    yksoft1  
    OP
       2018-09-23 19:44:37 +08:00
    @drquest 到 /emulators 目录下的东西模拟器是能看到并能读出来的,就是那个映射不行。
    yksoft1
        34
    yksoft1  
    OP
       2018-09-29 13:47:47 +08:00
    @drquest 感觉从 C 语言这一边根本改不了 Emscripten 的文件系统那些东西,要改还要把 Emscripten 里面的那些 js 的库开始
    drquest
        35
    drquest  
       2018-10-04 14:23:23 +08:00
    @yksoft1 你可以先挂到 /emulators 目录底下,然后再在 JS 那边以创建软链接的方式挂到 Emscripten 的根目录下。
    你看下这个针对 DOSBox-X 的改动
    https://github.com/db48x/emularity/pull/42/commits/aa4072779ae2bbc5b06609578584bc6ab50f049b

    里面这些行就是干类似的事情的
    FS.symlink('./emulator/y/FONT.ROM', '/FONT.ROM');
    FS.symlink('./emulator/y/2608_bd.wav', '/2608_bd.wav');
    FS.symlink('./emulator/y/2608_hh.wav', '/2608_hh.wav');
    FS.symlink('./emulator/y/2608_sd.wav', '/2608_sd.wav');
    FS.symlink('./emulator/y/2608_rim.wav', '/2608_rim.wav');
    FS.symlink('./emulator/y/2608_tom.wav', '/2608_tom.wav');
    FS.symlink('./emulator/y/2608_top.wav', '/2608_top.wav');

    这个 FS 是 Emscripten 的文件系统的 API
    https://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html
    yksoft1
        36
    yksoft1  
    OP
       2018-10-04 15:22:15 +08:00
    @drquest 问题就是 NP2 使用的 C API 在 Emscripten 那边有问题。导致 FS.symlink 的文件在 NP2 里面是看不到的,FS.mount 的能看到
    yksoft1ex
        37
    yksoft1ex  
       2019-01-04 14:34:08 +08:00
    @drquest 主号 @yksoft1 被封,以后使用现在这个号交流。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3493 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 10:18 PVG 18:18 LAX 02:18 JFK 05:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86