写在前面
作为80后,游戏记忆从小霸王开始,黄卡、手柄、大部分时间,全在魂斗罗、超级玛丽、坦克大战等游戏的声音里。后来街机厅的硬币,Game Boy的灰白屏幕,一台盗版机就装下了整个世界。那时捧着计算机杂志看PSP介绍页,好想买一台。如今赚够了买十台的钱,却找不回那份乐趣了。
我们怀念的从来不是复古游戏,而是游戏里那个无忧无虑的日子,但再也回不去了。
需求
很久之前我也买过开源复古游戏掌机,但感觉上手太难了,需要配置很多东西 等等。
不懂产品的程序员不是好程序员,对于需求的理解,首要是降低用户使用门槛,还有解决某些显性以及隐性痛点问题。我发现了很多的显性疼点问题,这里就不一一说明了。
本来我只是想弄模拟器游戏前端,跳转到各个模拟器应用(RetroArch、MAME4droid、NES.emu、NEO.emu、M64Plus FZ Pro、PPSSPP、DraStic、Dolphin(海豚)模拟器、GBA.emu、Real3DOPlayer、Citra、PCE.emu等)的。
相关技术
我发现,似乎可以集成 libretro-common,岂不是就可以直接启动游戏了?后续我还可以搞对战平台等等功能。介于libretro的某些性能问题,还是需要支持跳转三方游戏模拟器应用的。
游戏画面显示的关键函数:
游戏画面如何显示到 Android View(GLSurfaceView) ,
Libretro 在运行过程中,会通过
retro_video_refresh_t:
const void *data, unsigned width, unsigned height, size_t pitch
声音的关键函数:
retro_set_audio_sample
retro_set_audio_sample_batch
控制的关键函数:
retro_set_input_poll
实现对战平台的关键函数:
retro_serialize // 保存状态
retro_unserialize // 恢复状态
前提是需要先判断 游戏资源 是否一致。(使用CRC校验)
返回当前游戏的数据 ByteArray/byte[],主房间将这些数据发给客户端,
客户端使用 retro_unserialize同步画面相关数据,两边的画面就会保持一致,然后就是发送按键信息。