由于之前有过小游戏开发经验,也做过 js 游戏引擎相关的开发,还是蛮相信自己能搞定的。下载了代码,作者也没写注释,只能硬着头皮猜,核心部分就是用 js 模拟了 GBA 的 32 位 CPU,GBA 解包等等这些无关语言和环境的东西,只有最后拿到 ImageData 才涉及到渲染层,看上去还挺简单,要改的东西不多。
于是自己花了一两个小时,把涉及到 DOM 和 BOM 都改了,渲染全部由小游戏 canvas 接管,解决了一系列 BUG 后,终于能在模拟器上看到画面了。内心很激动,感觉要成了!
在模拟器出画面后,用真机调试,发现真机啥画面都没有,于是开始了 debug 之路,非常漫长,由于不知道是平台原因还是小游戏 API 不完善的原因,完全一行一行的 debug,一两个小时后,终于找到原因所在,一个 callback 导致的画面黑屏(为什么 Web 和模拟器都行,就是真机不行,小游戏&小程序的模拟器不靠谱啊)
搞定了上一个问题,更是兴奋,感觉离成功不远了,真机上跑了一下,怎么感觉 fps 有点低呢? drawcall 只有 2,但 fps 一直上不了 20,稳定在 12-15 左右,变成了幻灯片。用模拟器看了一下,模拟器能跑满 60fps,于是我就在想,会不会是渲染效率的原因,于是又开始了漫长的 debug。这次先找渲染层,也是一行行代码的测,因为不确定小游戏的引擎有哪些未知 BUG,所以这样来测比较细,也不会遗漏什么。这一测,就是 3 个多小时,还是完全没有头绪,各种方式都试遍了,依然保持 12fps。
本着不改好 bug 不睡觉的原则,继续刚,终于让我发现了问题所在。在 pc 端和手机浏览器上,能跑满 60fps,但小游戏不行,问题出在模拟 cpu 的核心代码上,用虚拟的 cpu 去运行 GBA 的 rom,pc 和手机浏览器只需要几 ms 的时间就能解析出一帧的画面,而到了小游戏里,则需要 80 多 ms,1000ms/80ms 约等于 12 左右,刚好解释了为什么 fps 在 12 左右波动。完全占据了 90%的性能开销。很奇怪为什么会开销这么大,这部分代码也没用到 polyfill,于是脑瓜更疼了。思来想去,于是想到,会不会是 ios 上小程序的 js 引擎并非系统的 js 引擎,而是自己实现了一套(突然想到了腾讯有自己的 x5 内核,会不会也有自己的"x5js")?带着疑问搜索了一圈,果真搜到了一篇文章,介绍了小程序的 js 引擎,是苹果的 JSC 引擎? WTF ? JSC 不是 Safari 的引擎吗?我明明用 Safari 试过没问题才准备移植的,带着疑问又上路搜关于 JSC 的资料,可算找到一个稍微靠谱的解释。
原来在 Safari 里,JSC 是带有 JIT 的,UIWebview 不带 JIT,也没有 Safari 那么好的优化,但具体是哪部分没有优化好,我继续在代码里找。由于小程序开发工具运行流畅,不好 debug,于是只有用真机打 log 看运行时间,又是花费一两个小时时间,终于找到了,原来是 ARM 的 STM 指令耗时,90%的时间都消耗在 STM 上了,由于鄙人能力有限,对计算机底层不太熟悉,到这一步就放弃了
![]() | 1 iamsee 2019-02-19 22:28:52 +08:00 via Android ![]() 我。。。cao,看完了佩服楼主,我辈楷模 |
![]() | 2 Enivel 2019-02-19 23:14:01 +08:00 via iPad 套个 webview 就完事了…… |
3 Captions 2019-02-19 23:42:59 +08:00 via Android 佩服之情,油然而生 |
![]() | 4 Actrace 2019-02-19 23:54:28 +08:00 这,,技术黑,很高端啊。。。 虽然腾讯自己搞的生态也是没好到那里去就是了。 |
![]() | 5 tanranran 2019-02-19 23:58:52 +08:00 特别佩服楼主的钻研精神,值得尊敬 |
![]() | 6 qq292382270 2019-02-20 00:01:34 +08:00 真心佩服.. |
![]() | 7 metalbug 2019-02-20 00:04:56 +08:00 你应该先搞 FC,有经验了再搞其他的 |
9 azh7138m 2019-02-20 01:00:39 +08:00 via Android ARMCoreArm 里面的函数看上去每次都会创建闭包。。。真酷炫,内存使用不会涨的很快吗? |
![]() | 10 pangtianyu 2019-02-20 01:16:30 +08:00 你的 stm 是怎么实现的 |
![]() | 11 w88975 OP @LevineChen 虽然小游戏也是相当于跑在浏览器里,但不用单独打个包,跨平台,传播性和方便性都强于其他方式。最初的目的也是做个好用的 GBA 模拟器跑在小游戏平台上。 |
![]() | 12 amazingrise 2019-02-20 01:47:49 +08:00 via Android 给楼主点个赞。。另外虽然我(出于爱好)做的项目没 lz 这么强,但是做项目的时候也有一样的感受。。lz 加油! |
![]() | 13 jswh 2019-02-20 02:15:27 +08:00 楼主有没有试过安卓上的执行速度,如果安卓上执行速度正常,那就说明不是硬件问题(理论上不应该,因为 safari 是好的)所以就是 js 引擎慢。微信的 webview 还是 uiwebview,是很慢的,以前做娃娃机直播的时候也遇性能问题(没有 Media Source Extensions API 只能用 jsmpeg, javascrip 性能低下,后来沟通过,只有白名单的一些网页可以开启 wkwebview,开了这个就好了。 |
![]() | 14 jswh 2019-02-20 02:34:53 +08:00 另外,我不知道这个 js 库是怎么处理的,但是根据“原来是 ARM 的 STM 指令耗时,90%的时间都消耗在 STM 上了”这个,估计是直接用 js 进行内存数据到图像数据的计算的,jsmpeg 用 webgl 的相关指令来解析视频数据流到图像的计算可以大大加速这个过程,小游戏也有 webgl,我觉得楼主可以考虑下这个方向。 |
![]() | 15 Mutoo 2019-02-20 06:35:44 +08:00 GBA 模拟器的本质是硬件模拟而不是游戏引擎,而 js 在手机上的运行速度是 PC 上的 1/50 左右,在这种效率下想要高帧率运行是很难的,除非用 wasm 去实现。不过现阶段 wasm 在手机平台上还不是很稳定。 附:GameBoy 模拟器 Javascript 实现完全解析 http://imrannazar.com/GameBoy-Emulation-in-Javascript:-The-CPU |
![]() | 16 devtk 2019-02-20 08:14:29 +08:00 厉害,钻研精神让人佩服 |
17 urmyfaith 2019-02-20 08:44:01 +08:00 看完了,初看还以为问题解决了呢,万万没想到系列... = = By the way, 赞楼主钻研精神! |
![]() | 18 jadec0der 2019-02-20 08:53:36 +08:00 我觉得 lz 还是很 nb 的 |
![]() | 19 ssshooter 2019-02-20 08:58:18 +08:00 太强了,能不能做个模拟 cpu 的教程 |
![]() | 21 tianyou666shen 2019-02-20 09:19:18 +08:00 很想玩小程序版本的 GBA |
![]() | 22 zkungfu123 2019-02-20 09:34:06 +08:00 很强了,不过不知道怎么过审 |
![]() | 23 imaple 2019-02-20 10:05:17 +08:00 厉害啊, |
![]() | 24 Valid 2019-02-20 10:06:45 +08:00 。。我也在搞 |
![]() | 25 hjq98765 2019-02-20 10:13:37 +08:00 LZ 很强大,虽然没看懂…… |
![]() | 26 dishonest 2019-02-20 10:17:46 +08:00 做了估计也上不了啊,lz 还是放弃吧 |
![]() | 27 Valid 2019-02-20 10:25:33 +08:00 gba 游戏文件一个就要 10+M,云端下载体验太差了。 |
![]() | 28 DeweyReed 2019-02-20 10:54:23 +08:00 为什么不试试 retroarch |
![]() | 29 bernie9 2019-02-20 11:05:00 +08:00 特地登录问一句,这样移植会涉及到版权的问题吗?会不会被游戏厂商告。。。 |
30 RoyL 2019-02-20 11:12:00 +08:00 做了也不能上吧...版权还没到期吧,虽然不知道小鸡那种版权怎么解决的 |
![]() | 32 mrcuya 2019-02-20 11:41:49 +08:00 我尝试移植过 FC 的模拟器到小游戏上,需要同样的问题,模拟器上很流畅,真机幻灯片。后来也是发现了这个问题,花了一个下午时间放弃了。 另外考虑到小游戏上线还要软著,审核麻烦。尝试移植到小程序上,发现 canvas 的 api 限制了很多,无法实现。遂放弃了,想想还是可惜。 希望前端大神能出个解决方案 |
![]() | 33 xi_lin 2019-02-20 12:22:47 +08:00 赞 lz 不过小程序应该是 WKWebview 吧 |
![]() | 34 xi_lin 2019-02-20 12:24:51 +08:00 能不能出个 demo,剥离掉渲染部分,只带数据解析部分,大伙一起来试试? |
35 lizhuoli 2019-02-20 12:33:10 +08:00 via iPhone ?微信不是内置 WebView 从 17 年底就切换到 WKWebView,使用 JSC 了吗。 你意思是,小程序现在还用的 WebView 容器,用的是 UIWebView ? |
36 RqPS6rhmP3Nyn3Tm 2019-02-20 13:02:45 +08:00 via iPhone PWAs 多好用,折腾微信干啥 |
37 bearqq 2019-02-20 13:33:10 +08:00 via Android 看这标题我还以为最后审核死活不过呢 |
![]() | 38 ljspython 2019-02-20 13:37:17 +08:00 能审核过吗 |
![]() | 39 Elethomdog 2019-02-20 13:41:40 +08:00 |
![]() | 40 14night 2019-02-20 13:55:52 +08:00 lz 很厉害了。。 |
41 leon0903 2019-02-20 14:23:43 +08:00 666666 |
![]() | 42 superarm 2019-02-20 14:29:43 +08:00 via iPhone 钻研精神厉害 感谢分享 |
![]() | 43 Exia 2019-02-20 14:33:46 +08:00 赞一下,感觉学到了不少 |
46 zepto 2019-02-20 16:54:34 +08:00 任天堂法务部表示严重关注 |
![]() | 47 nekoyaki 2019-02-20 19:36:07 +08:00 虽然楼主很厉害但是你图里那个是众神三角&四之剑,不是梦见岛哇。。。 |
![]() | 48 dreamwar 2019-02-20 19:39:57 +08:00 厉害 |
![]() | 51 zyEros 2019-02-20 21:17:13 +08:00 我之前有改过,里面有些困难也解决了,坑不少,但是涉及到任天堂的版权问题,就没有继续往下做了。 |
![]() | 53 Vincent720 2019-02-20 22:37:44 +08:00 期待大佬出手,让我学习学习 |
![]() | 54 Enix 2019-02-21 09:19:44 +08:00 via iPhone 很厉害,注意休息! |
55 chensong004 2019-02-21 09:57:15 +08:00 技术很厉害,赞一个!提前考虑版权问题,要不然白忙活了。 |
![]() | 56 cantonadong 2019-02-21 12:52:07 +08:00 via Android @w88975 FC 可玩性太低怕是没玩过霸王大陆、热血、天使之翼 |
57 fox0001 2019-02-21 13:13:05 +08:00 via Android 说起来,梦见岛好像还没通关,众神的三角力量和小人帽都没完美通关,四支剑一直玩不了… |
![]() | 58 windlee09 2019-02-21 14:02:37 +08:00 最近刚刚过审了一个小游戏, 软著通过后。单小游戏的图片、音效、背景音乐。都有严格的审核。被打回过 20 多次 基本上都是图片侵权了。开发引擎是用 layabox |
![]() | 59 libook 2019-02-21 14:10:15 +08:00 用 LLVM 把 C、C++写的 GBA 模拟器转成 Web Assembly,应该能接近原生编译的性能。 不过不知道微信支持的怎么样,微信开发工具基本上都是黑盒吧,摸索起来挺痛苦的。 |
![]() | 60 w88975 OP 放弃了,微信小游戏的引擎限制太多了,有个问题是无法解决的,就是音频播放,小游戏的 js 引擎无法实现音频处理,只能播放预设音频 |
![]() | 61 123s 2019-02-22 09:26:59 +08:00 牛逼啊 |
![]() | 62 wake1bear 2019-02-22 09:56:22 +08:00 果真是血泪史,顺膜拜一波大佬 |
![]() | 63 MINYAN 2019-02-22 14:29:06 +08:00 牛逼牛逼~ |
64 JerryLin 2019-02-22 17:32:52 +08:00 楼主这种钻研精神,相当佩服 |
![]() | 65 bobiscool 2020-07-31 22:19:14 +08:00 牛皮 |