聊聊为何开发复古游戏模拟器前端

60 阅读2分钟

写在前面

RetroLaunch: 模拟器游戏前端)

作为80后,游戏记忆从小霸王开始,黄卡、手柄、大部分时间,全在魂斗罗、超级玛丽、坦克大战等游戏的声音里。后来街机厅的硬币,Game Boy的灰白屏幕,一台盗版机就装下了整个世界。那时捧着计算机杂志看PSP介绍页,好想买一台。如今赚够了买十台的钱,却找不回那份乐趣了。

{2B883EF5-AF6D-4917-AF59-A27C9884615B}.png {5F409AD6-7563-4CFD-BFC3-5B51BE65A796}.png

我们怀念的从来不是复古游戏,而是游戏里那个无忧无虑的日子,但再也回不去了。

需求

很久之前我也买过开源复古游戏掌机,但感觉上手太难了,需要配置很多东西 等等。

不懂产品的程序员不是好程序员,对于需求的理解,首要是降低用户使用门槛,还有解决某些显性以及隐性痛点问题。我发现了很多的显性疼点问题,这里就不一一说明了。

本来我只是想弄模拟器游戏前端,跳转到各个模拟器应用(RetroArch、MAME4droidNES.emuNEO.emuM64Plus FZ ProPPSSPPDraSticDolphin(海豚)模拟器GBA.emuReal3DOPlayerCitraPCE.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同步画面相关数据,两边的画面就会保持一致,然后就是发送按键信息。