1. 复古掌机的选择
手里刚好有台闲置的小米 9,加上一个手柄,不如把它改造成一台复古掌机。目前市面上的设备主要分为 Android 和 Linux 两类,整体来看 Android 生态更丰富,除了模拟器还能运行原生安卓应用。
| 项目 | Android 掌机 | Linux 掌机 (ArkOS / JELOS / Batocera) |
|---|---|---|
| 启动速度 | 20~40 秒 | 5 秒以内 |
| UI 一致性 | ❌ 多 app 无统一样式 | ✅ 完整游戏平台风格 |
| PS2(AetherSX2) | ✅ 可玩(Snapdragon / Dimensity / Unisoc) | ❌ 官方 Linux 版 core 不成熟 |
| Switch(Yuzu) | ✅ 安卓有社区版 Yuzu | ❌ 完全无解 |
| PSP/NDS/GBA etc | ✅ 但调用 APK,界面割裂 | ✅ 全集成 Core,UI 统一 |
| 云游戏 / Steam Link | ✅ 完全支持 | ⚠️ 只能 Moonlight(若有 Core) |
| 系统自由度 | 限制 root,定制难 | ✅ 想怎么魔改都行 |
| 易用性 | ✅ 下载 ROM → 配 APK → 玩 | ⚠️ 需要 BIOS / Core 手动配置 |
| 适合人群 | 玩模拟器 + 云游戏 + 装 APP | 想要'开机就是游戏机'的感觉 |
| 视觉体验 | 类似安卓电视盒 + 各种前端 | 像原生游戏机固件,主题风统一 |
有个现象挺有意思,安卓底层也是 Linux,为什么有些模拟器只能在安卓跑?查了一下主要是生态原因。比如 PS2 模拟器的作者 Tahlreth 只开发了 AetherSX2 for Android,使用了 Android NDK + Vulkan/OpenGL ES 来实现 JIT,这些几乎成了安卓平台的独占特性,移植到 Linux 难度很大。
JIT / 动态重编译器(Dynarec)
JIT(即时编译)是模拟器、虚拟机等场景的核心性能优化技术。它能在程序运行时,将宿主设备不兼容的原始指令实时转换为机器码,而非逐条解释执行;同时会监测并识别频繁执行的'热点代码',通过函数内联、循环展开等手段生成更高效代码,大幅减少翻译开销,让原本卡顿的程序在设备上流畅运行。
对于复古掌机来说,最难的部分其实就是模拟器本身,涉及到汇编指令的模拟和调度。之前写过一点 GB 模拟器的实现,后来空了没发出来。
再看看市场情况,参考当前行情。用很火的安伯尼克来看,35XX 是 T700,1 颗 2.5GHz 的 Cortex-A76 大核、3 颗 2.3GHz 的 Cortex-A76 大核。406V 是 T820,1 颗 2.7GHz 的 Cortex-A76 大核、3 颗 2.3GHz 的 Cortex-A76 大核。总体来说性能有提升,但是提升不大,价格却翻了 2~3 倍。
正好手里有一个闲置的小米 9,配置高通骁龙 855 处理器。对比 T820,855 单核几乎翻倍,整体多核也 1.5–2 倍以上。同时 855 GPU 性能是 T820 的 3 倍以上。
而年初买的二手的小米 9 多少钱呢,350,现在可能还更便宜。自己再加上一个手机手柄,加完也就只是 406V 一半的价格,目前市场上的安卓掌机价格偏贵是不争的事实。自己动手价格减半,性能翻倍,中间还可以学一些知识。所以折腾一下小米 9,看来是更明智的选择。
2. 天马 G 前端的安装
看了一下,目前国内流行的就是天马 G 的前端。现在不管是玩家还是工作室,几乎都用的这个。

在网上买了一套包,照着安装即可。安装分成三个步骤,首先是 App,然后是配置,最后是 Roms。
2.1 APKS

大概是这些内容,MT 管理器是用来拷贝文件的,天马 G 就是整体入口,用的最多的其实还是 RA,其它的就是各个单独的模拟器。我是用 adb 装过去的。安装完成之后启动一下赋予权限,不需要再搞别的什么。
2.2 配置
配置主要有三块:PG_安卓主题包 v1.2 230514.zip,PG_天马 G 安卓配置 v1.2 230415.zip,最后还有一个 Android 文件夹。
这里 PG_安卓主题包和 PG_天马 G 安卓配置都是天马 G 的配置文件,包含金手指、文件存档之类。
还有一个 Android 的文件夹。

原因如下:
在 Android 11 及以上系统中,每个 App 的数据目录(Android/data/包名)是受系统沙盒保护的,普通文件管理器无法直接写入。 但天马 G 前端要让多个独立 App(Pegasus、RetroArch、AetherSX2)共享配置文件、ROM 路径和启动脚本,因此需要提前把它们的配置放好。
所以这部分只能手动弄。
2.3 Roms
Rom 的内容就比较敏感了,涉及合法与非法的区别,所以模拟器或者各大工作室不会明面上提供 ROM,这些就要自己去找。不过国内部分有现成的整合包,里面内容还挺全的。现在网上基本都是这类资源。
Rom 就是正常的游戏镜像,照理说直接拷贝到 SD 卡或者手机上就行了,但是天马 G 毕竟显示效果牛批嘛。所以根据天马前端 UI 的要求,要增加一些文件。
以恶魔城,白夜协奏曲为例,大概是这些文件。

一个主图,一个副图,一个介绍动画。
此外整体还有一个 metadata,直接用精简包里面的即可。弄完之后放在手机根目录的 Roms 下面。
如果是用的整合包的发布,这些内容在精简包里面都是做好了的。
2.4 运行
比想的要顺利一点。

首先界面确实华丽了不少,比起一般 linux 掌机就是文字,确实好看也方便了很多。

使用 USB 直接外接的手柄,也是非常方便,几乎感觉不到延迟。
但是手机也有自己的问题,主要就是屏幕尺寸,运行很多游戏时,两边会有很大的黑边,影响了一部分游戏感受。不过 PSP 就看着好很多。

总体还是满意的,钱省了,然后闲置的物品也利用起来了,探索技术的心情也满足了。
3. 天马 G 的技术原理
天马 G 其实也是一个开源项目,官网地址是:https://pegasus-frontend.org/
其实和之前认为的有点点区别,天马 G 还真就只是一个前端,所有干的事情就相当于一个 ROM 管理器和模拟器启动器 launcher。所有的核心内容,还是依赖于各家模拟器自己的 APK。

整套本身实现是基于 QT,所以才看到天马 G 现在有那么多平台。其实功能本身不复杂,也没有太核心的技术,还是调用第三方的模拟器。看了一下,Android 的核心代码如下:
public static String launchAmCommand(String[] args_arr) {
final LinkedList<String> args = new LinkedList(Arrays.asList(args_arr));
if (args.isEmpty()) return "No arguments provided to 'am'";
final String am_command = args.pop().toLowerCase();
if (!am_command.equals("start")) return "For 'am', only the 'start' command is supported at the moment, '" + am_command + "' is not";
try {
Intent intent = IntentHelper.parseIntentCommand(args);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
m_self.startActivity(intent);
} catch (Exception e) {
return e.toString() + ": " + e.getMessage();
}
return null;
}
拼接好参数,JNI 直接 startActivity 去调用三方模拟器。天马 G 提供的,就是一套 UI 框架,也只有一套这个。如果你直接装一个 RetroArch,感觉其实也能玩,还方便很多。
4. FPGA 的扩充
对模拟器本身还是挺关注的,能否接一个 FPGA 来提升性能呢?将来的将来的将来再看吧。。。


