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

RetroPie 是啥?

一个用于将树梅派等板子转变为游戏机的开源项目。

62dd3226bf36d7f222efaa982fa12acc.png

树梅派上运行 RetroPie

Github:

https://github.com/RetroPie/RetroPie-Setup

第一感觉,基于 Shell,有啥牛逼的。

但仔细想想,一个简单的项目能获得 9.4K 的 Star,肯定有其过人之处。

想要实现模拟复古游戏机最重要的 2 件事

1、有能模拟运行复古游戏的模拟器。

最流行的模拟器是 RetroArch。

RetroArch 本身不负责模拟游戏,而且为各种更底层的各种模拟器提供一套统一的框架。

RetroArch 负责音频、显示等各种基础功能,各种模拟器核心负责实际地对游戏模拟。

一个模拟器核心能模拟一个硬件平台,例如 mGBA 能模拟 GBA 掌机。

2. 有一个能让用户选择启动游戏的菜单界面,即启动器。

最流行的开源启动器是 Emulationstation。

95d75cce4153167700e950760b1526ce.png

树梅派上运行 Emulationstation

另一个比较优秀的开源启动器是 Pegasus:

242ee8265958c1cc1f9c06cee172dc78.png

树梅派上运行 Pegasus

Pegasus 是 Qt 写的,感兴趣的话,可以看看其源码,代码质量挺好的。

内部实现

我曾经阅读过一段时间的 RetroPie 的源码。

最深刻地感受是:优雅、真香。

从需求上看,RetroPie 最核心的功能是要编译、安装、配置 RetroArch、Emulationstation 和各种模拟器软件包。

对于每一个软件包,RetroPie 都会定义一组函数集

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

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

每一个软件包都只要专注在实现这 4 个接口上,以便 RetroPie 的核心层调用。

RetroPie 的核心层

system.sh,用于适配多个硬件平台。

helpers.sh,包含各种辅助函数。

packages.sh,软件包管理相关的 API。

运行 RetroPie 的 retropie_setup.sh 时,首先会将所有的软件包注册进核心层,存放在数组里。

相关 API 是:rp_registerModule()

当要编译安装某个软件包时,以 Retroarch 为例,会通过 rp_callModule() 依次调用 retroarch.sh 里的:

function depends_retroarch()
{...}
function sources_retroarch()
{...
}
function build_retroarch()
{...
}
function install_retroarch()
{...
}

RetroPie 的核心设计就是上面这些内容,但是具体实现起来,还是有很多技巧在里面的,非常值得我们学习,这里我就不展开分析了。

另外,RetroPie 的 Shell 编码风格非常好,我们可以将其作为标准。

我在工作中写过许多 shell 脚本,大致分类为:

  • 测试稳定性的脚本;

  • 辅助定位 bug 的脚本;

  • 辅助日常工作的自动化脚本;

  • 用于快速构建软件原型的脚本;

  • 公司内部软件;

最深刻地感受是:

Shell 是一把利器,用起来很爽,但是要小心一点,别伤着自己了。

总结

34320b8e7da77a17c23062484caaf76e.png

RetroPie 是一个优秀的开源项目,它的功能并不复杂,这是由于它有极其的优秀的设计。

我从中学到的东西

将简单的功能做好做稳定,是一件很了不起的事。

做板子的公司那么多,而做到全球流行的只有树梅派一家。

做一个好的产品,从来不是靠点子,不是靠能力,不是靠智力,而是看你有没全心全意为用户着想,是否始终从用户的角度出发。

参考资料

https://retropie.org.uk/

https://github.com/RetroPie/RetroPie-Setup

https://www.retroarch.com/

https://emulationstation.org/

https://pegasus-frontend.org/

—— The End ——

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java线程池,信号量使用demo

直接上代码 package org.jimmy.threadtest20181121;import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit;public class TestThread20181128 {public Semaphore semaphore new Semaphore(2, true)…

Spring JDBC最佳实践(2)

2019独角兽企业重金招聘Python工程师标准>>> 使用DataSourceUtils进行Connection的管理 由上节代码可知,JdbcTemplate在获取Connection的时候,并不是直接调用DataSource的getConnection(),而是调用了如下的代码: Connection con …

我所感受到的上海

大家好,文章转自张老师的公众号,文章的我不是小编本人,小编现居深圳,刚接受了一场大雨的洗礼。前两天公众号抽奖的书籍已经发货,中奖的朋友们注意查收。当格蠹园里的大灰反复犹豫到底应该在哪里生产的时候,…

设计模式学习笔记五——Prototype模式

动机:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。某些结构复杂对象面临着剧烈变化,但拥有比较稳定一致的接口,如何隔离出这些易变对象,使客户程序不随之改变?场景:Th…

2011年最佳代码

2019独角兽企业重金招聘Python工程师标准>>> 2011年最佳代码 try { if(you.bevieve(it) true || you.believe(it) false) { I.believe(it); } } catch(Exception ex) { throw new Exception("Its a miracle!"); } finally { it.justHappened(); } 转载于…

昨晚两点睡

深圳下雨两天,我们居家办公两天,不过奇怪的事情是,这两天我都到公司上班,昨天早上没有下雨,我想着应该要去公司,结果到了公司才知道原来今天可以居家办公。不过,在公司才有上班的感觉&#xff0…

hashmap详解

一.hashmap的数据结构 HashMap采取数组加链表的存储方式(哈希表)来实现。亦即数组(散列桶)中的每一个元素都是链表 二.hashmap的构造函数 HashMap():构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。 HashMap(int initia…

书籍推荐-记这几年看的书

这几年看了不少书,大部分是自掏腰包,看一本好书是享受,我很喜欢这种感觉。 这些是我这几年看书的一些心得,对于一些新手来说,可能有点帮助。 这几年一直在走技术路线,所以看的大部分都是技术方面的书籍&…

不复位MCU直接调试运行程序,让bug闻风丧胆

大家周末好呀,文章转自bug菌的公众号,文章介绍步复位情况下调试bug,希望对大家有用。1调试窘境经常有朋友在开发中遇到这样的窘境,当单片机程序运行异常以后,由于调试信息做得并不是很全面,导致相应的问题场…

这次比opencv快⑥倍!!!

打败opencv ,哦,是快了3倍上回书说道,我用汇编neon实现去畸变算法比opencv快3倍,这都不算啥,这次新增了透视变换算法,二者加起来比opencv快6倍!拭目以待吧。啥玩意是透视变换?相信你们都开过高级…

数据和数据类型

一、什么是数据: 数据(date)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未加工的原始素材。 1)数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。数据和信息是不可分离…

涂鸦的这套宠物SDK设计,真香

我应该在之前的文章里面说过,我之前创业的时候做过宠物方面的产品,而且我们当时用的是乐鑫的芯片。最近知道在涂鸦工作的朋友也在研究这方面,他给我寄了几个小板子,还有涂鸦的IOT SDK,我玩了几天,觉得真的很…

准备 KVM 实验环境 - 每天5分钟玩转 OpenStack(3)

转载:http://cloudman.blog.51cto.com/10425448/1747415 KVM 是 OpenStack 使用最广泛的 Hypervisor,本节介绍如何搭建 KVM 实验环境 安装 KVM 上一节说了,KVM 是 2 型虚拟化,是运行在操作系统之上的,所以我们先要装一…

电子美图高清系列漫画分享给大家欣赏!

电子漫画搞电子的大家或多或少都会收集了电子漫画和表情到,小编找了一份比较全高清无码的电子美图漫画,供大家欣赏,提供下面三种下载方式!1、GitHub:https://github.com/chiphome/Electronic-Comics2、Gitee&#xff1…

如何提高网页中图片显示的用户体验(附源码下载)

文章中加入适量的图片不仅可以更好的说明和补充文章的内容,而且还可以极大的减缓阅读者在阅读较长篇幅文章时的疲劳和不安。所以图文混排较好的文章能给阅读者更好的用户体验和享受。但是令人遗憾的是很多的网页图片的显示并不十分理想,非但没有给阅读者…

全开源最小电压表:24位ADC,测量0~2V,五位半

1、项目背景2015年5月份评估完十几种24位ADC后就从第一份工作岗位上离职了,做的24位AD都没有达到实际的效果,一直耽搁困扰了好久。是硬件设计的问题?还是软件开发的问题?还是24位ADC真的不咋地?还是要离职了干活就不负…

小小Table

图1 图2(加了蓝色,让问题更清楚)说明:1.工作需要要做这样一个图形(图1),而且要求不用表(table)套表(table)即一个table画出。2.素材有图表两张:(12*14),(12*13) 颜色为Red感兴趣的朋友…

文件断点续传原理与实现

文件断点续传原理与实现 在网络状况不好的情况下,对于文件的传输,我们希望能够支持可以每次传部分数据。首先从文件传输协议FTP和TFTP开始分析, FTP是基于TCP的,一般情况下建立两个连接,一个负责指令,一个负…

Windows Forms、MFC、WTL、WxWidgets、Qt、GTK综合比较

图形界面库Windows Forms、 MFC、WTL、 WxWidgets、Qt、GTK 综合比较见下表: 总结: GTK主要用在X Window上,整个设计的架构和许多概念和MFC以及一般 Windows 上的程序开发大异其趣,入门门槛较高,而且最主要的特色是&am…

G3,是塔克和阿德巴约的热火队

这一场,是塔克和阿德巴约的热火队G2的比赛,波斯顿人的数据如下G3的比赛,波斯顿人的数据如下如果说田忌赛马可以用在篮球场上,那这场堪称经典热火和波斯顿人的第三场比赛,火队是客场作战,客场作战的热火在第…