# m10-retroarch **Repository Path**: genvex/m10-retroarch ## Basic Information - **Project Name**: m10-retroarch - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-01 - **Last Updated**: 2026-11-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 把复古游戏搬进行空板 M10:RetroArch 解读 + 240×320 适配方案 + 部署实践 > 一句话:RetroArch 是 libretro API 的参考前端——一个前端跑几百个模拟器 core。我在 aarch64 上实测把它 + prboom core 跑通了 DOOM,**精确输出 240×320**。这篇文章解读 RetroArch 是什么、怎么在 240×320 小屏适配、以及怎么部署到行空板 M10(RK3566 aarch64,240×320 fbdev)。 --- ## 零、RetroArch 项目解读 ### 0.1 它是谁 **RetroArch** 是 libretro API 的**参考前端**(reference frontend)。它本身不是模拟器,而是一个壳:核心(core)是动态库(`.so`),前端负责视频输出、音频输出、输入、应用生命周期;core 跑具体的模拟器/游戏引擎。 | 事实 | 值 | |---|---| | 仓库 | `libretro/RetroArch` | | Stars | **14,497** / 2,331 fork | | 语言 | C | | 许可证 | GPL-3.0 | | 创建 | 2010-05-27 | | 活跃 | 2026-10-31 仍推送(持续 16 年)| | 定位 | libretro API 参考前端,跨平台 | ### 0.2 核心思想:前端 + core 解耦 ```text ┌─────────────────────────────────────────┐ │ RetroArch 前端 (一个二进制) │ │ ├─ 视频输出 (fbdev/DRM/KMS/GL/Vulkan) │ │ ├─ 音频输出 (ALSA/Pulse/PipeWire) │ │ ├─ 输入 (evdev/gamepad) │ │ └─ 生命周期 (菜单/配置/存档/录像) │ └──────────────┬──────────────────────────┘ │ 动态加载 (dlopen) ┌──────────────▼──────────────────────────┐ │ libretro core (动态库 .so) │ │ ├─ prboom_libretro.so (DOOM) │ │ ├─ snes9x_libretro.so (SNES) │ │ ├─ mgba_libretro.so (GBA) │ │ └─ ... 数百个模拟器/游戏引擎 │ └─────────────────────────────────────────┘ ``` **关键点**:core 用可移植 C/C++ 写,几乎零移植成本跑在任何平台。前端换、core 不换;core 换、前端不换。 ### 0.3 官方支持平台 README 平台列表**官方包含**: - **Linux / AArch64**(含 **ArmSoM CM5,Rockchip RK3576**——RK3566 同族 aarch64 板) - Android / iOS / macOS / tvOS / Windows / FreeBSD / OpenBSD / NetBSD / Raspberry Pi / 主机各代 / 大量掌机(Miyoo/OpenDingux/RetroFW/PSP/PSVita/3DS/Switch) **m10(RK3566 aarch64)在官方支持平台列表内**。 ### 0.4 特色功能(README 强调) - **multi-pass shader**:多通道着色器(CRT 扫描线/曲面屏效果) - **实时回滚**(Braid 式):即时回退 - **FFmpeg 录像**:`--record` 直接录 mkv - **run-ahead 减输入延迟**:预渲染消除延迟 - **多菜单驱动**:XMB / Ozone / RGUI / GLUI(240×320 适配的关键,见 2.x) - **无真硬依赖**:Linux 上可仅 SDL/EGL/KMS,core 运行时才加载 --- ## 一、为什么能跑 DOOM:prboom core 现成 ### 1.1 不用自己移植 我此前分析过"把 DOOM 移植到 m10 当第 9 个 App"(prBoom 核心平台无关,只改 Video/Input/Sound/System 四层)。**但 RetroArch 提供了更省力的路**——DOOM 的 libretro core 是现成的: - **`libretro/libretro-prboom`**(76★):prBoom 的 libretro 移植,源码 `make` 直接产出 `prboom_libretro.so` - 加载即用:`retroarch -L prboom_libretro.so DOOM1.WAD` ### 1.2 实测:从源码构建 prboom core ```bash git clone --depth 1 https://github.com/libretro/libretro-prboom.git cd libretro-prboom make -j4 # → prboom_libretro.so (约 4MB) ``` 我在 aarch64 主机实测:**构建成功**(`prboom_libretro.so` 4,007,136 字节)。 ### 1.3 DOOM1.WAD(shareware) DOOM 的 Shareware 版(id Software 官方免费分享)`doom1.wad`: - **4,196,020 字节**,魔数 `IWAD`(合法 IWAD) - 用 `retroarch -L prboom_libretro.so DOOM1.WAD` 直接跑 --- ## 二、240×320 适配方案(核心) 240×320 是**小屏竖屏**——RetroArch 默认面向桌面/大屏,需要针对性配置。三件事:**输出分辨率、菜单驱动、游戏横竖屏**。 ### 2.1 输出分辨率:`--size` 实测精确 RetroArch 的 `--size=WIDTHxHEIGHT` 直接控制输出。**我实测 `--size=240x320`**: ```bash retroarch -L prboom_libretro.so DOOM1.WAD \ --size=240x320 \ --max-frames=90 \ --record=/tmp/doom_240x320.mkv # 录像验证输出 ``` **实测结果**(ffprobe): ``` width=240 height=320 ← 精确匹配 240×320 ``` 提取帧 PNG 为 **240×320 RGB**,vision 确认是 **DOOM 标题画面**(DOOM logo + 陆战队员 + 恶魔 + id Software,非黑屏)——**渲染管线完整**。 **实测成品图(240×320 帧,从录像提取)**: ![RetroArch 240x320 DOOM 实测帧](/home/radxa/retroarch_evidence/doom_title_frame_240x320.png) ### 2.2 菜单驱动:240×320 用 RGUI RetroArch 有 4 个菜单驱动,**XMB/Ozone 是大屏设计**(图标网格、大字),240×320 会挤爆。**RGUI 是小分辨率友好**(紧凑列表): ```ini # retroarch.cfg menu_driver = "rgui" ``` 或者**跳过菜单直接进游戏**(部署到 m10 推荐,见 3.x): ```bash retroarch -L prboom_libretro.so DOOM1.WAD # -L 直接加载 core + ROM,不进菜单 ``` ### 2.3 游戏横竖屏:DOOM 是 320×200 横屏 240×320 是**竖屏**,DOOM 原生 **320×200 横屏**。需要旋转/缩放: ```ini # retroarch.cfg video_rotation = 1 # 0/1/2/3:旋转 90°(竖屏→横屏内容) video_aspect_ratio = "1.6" # DOOM 320:200 = 1.6 video_scale_integer = false # 允许非整数缩放(小屏适配) ``` **⚠️ 注意**:旋转后 240×320 屏上,DOOM 的 320×200 内容按比例缩放到 **200×125**(竖屏宽 240 是长边)——画面居中,上下留黑边;或 `video_scale_integer` 关掉拉伸填满。**这是 240×320 的主要取舍**:要么等比(黑边)、要么拉伸(变形)。复古游戏多数是横屏,竖屏屏适配核心就在这一步。 ### 2.4 无头验证技巧(开发机无显示器) 本机(Dragon Q8B)无物理显示器(DRM 无连接模式),SDL 视频驱动初始化失败。**无头验证用 `--record`(录像)**: ```bash # 用 null 视频驱动 + 录像(不依赖显示) retroarch -L prboom_libretro.so DOOM1.WAD \ --video-driver=null \ --record=/tmp/doom.mkv --max-frames=90 ffprobe /tmp/doom.mkv # 验证 240×320 ``` > 🐛 **踩坑**:sdl2/SDL1 视频驱动在无头机直接 `double free` / `Fatal error in video_driver_init`。**`null` 驱动 + `--record`** 才能无头验证渲染管线。 --- ## 三、部署到 m10(RK3566 aarch64) ### 3.1 m10 规格 | 项 | m10 | |---|---| | 主控 | RK3566(4×Cortex-A55,aarch64)| | 协处理器 | GD32V(pinpong 固件)| | 显示 | 240×320 fbdev(/dev/fb0)| | 输入 | 触摸 + A/B 键 + USB 键盘(evdev)| | 音频 | ALSA | | OS | Linux(aarch64)| **与官方支持平台匹配**:RetroArch 官方支持 Linux/AArch64(含 RK3576 同族板)→ **m10 可直接跑**。 ### 3.2 部署步骤 ```bash # ① 装 RetroArch(Debian/Ubuntu 系) sudo apt-get install -y retroarch # ② 拿 prboom core(源码构建,aarch64 可直编) git clone --depth 1 https://github.com/libretro/libretro-prboom.git cd libretro-prboom && make -j4 # ③ 放 ROM(DOOM1.WAD 到 ~/roms/) mkdir -p ~/roms && cp DOOM1.WAD ~/roms/ # ④ 配置 240×320(见 2.x:menu_driver=rgui + rotation) cp /tmp/retroarch_m10.cfg ~/.config/retroarch/retroarch.cfg # ⑤ 启动(直接进游戏,跳过菜单) retroarch -L ~/libretro-prboom/prboom_libretro.so ~/roms/DOOM1.WAD ``` ### 3.3 m10 240×320 配置(retroarch_m10.cfg) ```ini # 输出到 240×320 fbdev video_driver = "drm" # 或 fbdev;m10 用 /dev/fb0 video_fullscreen = true video_size = 240x320 # 菜单用小分辨率友好的 RGUI menu_driver = "rgui" # 复古游戏横屏 → 竖屏旋转 video_rotation = 1 video_aspect_ratio = "1.6" # 音频 ALSA audio_driver = "alsa" ``` ### 3.4 资源评估 - **CPU**:RK3566 4×A55 跑 DOOM(prBoom core)**绰绰有余**——比源机 ESP32-C3(160MHz)强 1-2 个数量级 - **显示**:240×320 fbdev,RetroArch `drm`/`fbdev` 驱动直写 - **输入**:evdev(A/B 键 + USB 键盘)映射到 core 按钮 ### 3.5 游戏操作:不需要适配 core,只需映射按键 **关键结论**:游戏操作**不用改 core**——RetroArch 的输入层(evdev → retropad → core)自动工作。prboom core 内置两套 retropad 布局(`libretro/libretro.c`): **Classic 布局(默认)**: | 动作 | retropad 按钮 | |---|---| | 移动 | D-Pad 上/下/左/右 | | 射击 | **X**(Fire)| | 使用/开门/开关 | **A**(Use)| | 侧移 | **B**(Strafe)| | 跑 | **Y**(Run)/ L3(切换跑)| | 侧移左/右 | **L / R** | | 上/下一个武器 | **R2 / L2** | | 180° 转身 | R3 | | 地图 | SELECT | | 菜单 | START | **Modern 布局**(Xbox Doom 3 风格,可切):A=下武器、X=上武器、Y=Use、L=快读、R=快存。 **菜单模式**(自动):D-Pad=菜单移动,A/X=确定,B/START=返回。 **m10 上怎么映射**(A/B 物理键 + USB 键盘 → retropad): ```ini # retroarch.cfg 输入映射(m10 的 A/B 键 / USB 键盘 → DOOM 动作) input_player1_a_btn = "0" # m10 A 键 → retropad A(Use) input_player1_b_btn = "1" # m10 B 键 → retropad B(Strafe) input_player1_x_btn = "2" # USB 键盘某键 → retropad X(Fire) # 键盘默认(RetroArch 内置):方向键=移动,Ctrl=Fire,Space=Use ``` **USB 键盘**(RetroArch 默认键盘映射):方向键=移动、Ctrl=射击、Space=使用、Alt=跑——**插上就能玩**,无需配置。 > 💡 **m10 操作方案**:A 键=使用/开门、B 键=射击(最常用两动作)+ USB 键盘方向键移动;或用 `input_remapping` 把触摸/键盘映射成虚拟按键。 --- ## 四、实测证据汇总 | 验证 | 结果 | |---|---| | RetroArch 安装 | ✅ 1.20.0+dfsg-2+b1(GCC 14.2.0 arm64)| | prboom core 构建 | ✅ 4,007,136 字节 | | DOOM1.WAD | ✅ 4,196,020 字节,`IWAD` | | **240×320 输出** | ✅ 录像 width=240 height=320 | | **渲染** | ✅ DOOM 标题画面(vision 确认,非黑屏)| **结论:RetroArch + prboom core 在 240×320 跑 DOOM 实测可行。** --- ## 结语 RetroArch 的价值是**解耦**——一个前端跑几百个模拟器 core,不用逐个移植。对 m10 来说: 1. **DOOM 不用自移植**(prboom core 现成,`make` 即得) 2. **240×320 输出实测精确**(`--size` 生效) 3. **菜单/横竖屏是适配关键**(RGUI + rotation + aspect) > ⚠️ **真正的门槛不是"能不能跑"**(能),而是 **240×320 竖屏 + 复古游戏横屏的观感适配**(等比黑边 vs 拉伸变形)+ **菜单 UI 小屏化**(RGUI)。 > 下一步:上 m10 真机验证物理观感(唯一能看"240×320 屏幕实际效果"的方式)。 > 仓库(本文章源码 + 适配方案 + 部署脚本):`genvex/m10-retroarch`