跨平台的 RetroArch ,设计方式竟和 RetroPie 如出一辙!

RetroPie 的设计

对于 RetroPie,我之前写过一篇关于其内部设计的文章:

嵌入式界的顶流开源项目,RetroPie 内部是怎么设计的?

RetroPie 为了支持各种软件包,定义了一组 API:

function depends_${package}()
{
    ...
}
function sources_${package}()
{
    ...
}
function build_${package}()
{
    ...
}
function install_${package}()
{
    ...
}

分别对应获取源码、编译、安装、配置 4个步骤。

每一个要接入 RetroPie 的 软件,例如游戏模拟器 RetroArch、启动器 Emulationsataion 等,都要实现这一套 API,以供 RetroPie 的核心层调用,以 RetroArch 为例:

function depends_retroarch()
{
    ...
}

function sources_retroarch()
{
    ...
}

function build_retroarch()
{
    ...
}

function install_retroarch()
{
    ...
}

这是很典型的模块化设计,每一个软件包都只需要关注在自身的编译安装流程上,不需要理会其他事情。

RetroArch 也是相同的设计思路

RetroArch 一个 C 语言编写的跨平台复古游戏模拟框架。

RetroArch 本身不进行实质的模拟功能,而是提供一套框架,所有的第三方开源模拟器都可以接入到这套框架中,从而为用户提供更多更好的功能和体验。

RetroArch 和 RetroPie 的功能需求上有一个相似之处

RetroPie 需要管理各种游戏相关的软件;

RetroArch 也需要管理各种模拟器软件;

所以,RetroArch 也采用了和 RetroPie 类似的设计思路,定义了一组 API

RETRO_API void retro_init(void);

RETRO_API void retro_deinit(void);

RETRO_API void retro_run(void);

RETRO_API bool retro_load_game(const struct retro_game_info *game);

RETRO_API void retro_unload_game(void);
...

每一个要接入 RetroArch 的第三方模拟器,都要实现上面的 API。

以第三方模拟器 gambatte-libretro 为例,下面是 retro_run() 的实现:

void retro_run()
{
    ...
    // 获得用户输入
    input_poll_cb();
    
    ...
    // 播放游戏声音
    render_audio(sound_buf.i16, samples);

    ...
    // 显示游戏画面
    video_cb(video_buf, VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_PITCH * sizeof(gambatte::video_pixel_t));
    ...
}

当用户要求启动模拟某个游戏时, RetroArch 的核心层就会先调用相应的第三方模拟器的 retro_init() 进行初始化。

最关键的一步是会调用到 retro_run(),模拟器会在这个函数里实现最重要的游戏功能

1、处理用户输入;

2、模拟出游戏的画面,然后调用 RetroArch 核心层里显示相关的接口将画面数据显示出来;

3、模拟出游戏的声音,然后调用 RetroArch 核心层里音频相关的接口将声音数据播放出来;

这就是 RetroArch 最核心的设计。

RetroArch 是一个跨平台的应用,代码量庞大,其内部实现有许多值得学习了解的地方,大家可以先自行学习。

总结

设计软件是一件很有挑战的事情。

我们可以从流行的开源软件上,学习到真正优秀的设计。因为正是这些优秀的设计,让这些开源软件得以存活下来。

相关资料

https://www.libretro.com/index.php/api/

https://github.com/libretro

https://github.com/libretro/gambatte-libretro/blob/master/libgambatte/libretro/libretro.cpp

—— The End ——

推荐阅读:

专辑 | Linux 系统编程

专辑 | Linux 驱动开发

专辑 | Linux 内核品读

专辑 | 每天一点 C

专辑 | 开源软件

专辑 | Qt 入门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值