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

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

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

    看这几天浏览器里的 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
    terrytw
        1
    terrytw  
       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   ·   实用小工具   ·   3078 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 00:35 · PVG 08:35 · LAX 16:35 · JFK 19:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.