code学习

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

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:加微信领取资料

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

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

文章链接:

https://mp.weixin.qq.com/s/T4sys9NdZzHizWm4NHFnew

转载自:老吴嵌入式,作者吴伟东Jack

文章链接:跨平台的 RetroArch ,设计方式竟和 RetroPie 如出一辙!