打造专属 Switch 模拟游戏机

2种方案

Switch版RetroArch

RetroArch 是一款高度可定制化的跨平台全能模拟器,由 Libretro 团队开发。它不仅模拟单一游戏平台,而是通过不同的“核心”(cores) 支持多种游戏机和计算机系统,允许用户在单一应用中玩遍NES、SNES、Game Boy Advance、Sega Genesis乃至PlayStation等众多平台的经典游戏。RetroArch 还提供了高级功能,比如实时重播、网络对战、各种视频滤镜和增强功能,以及高度可配置的控制设置。

官网:https://www.retroarch.com/

刷机安装方法详见:Switch双系统:2024.6,自己动手丰衣足食版

Lakka系统

Lakka是一个专门为复古游戏爱好者设计的轻量级Linux发行版,它能够将各种低配置的硬件平台,特别是老式计算机,改造成功能全面的复古游戏主机。Lakka基于OpenELEC项目,并内置了RetroArch作为其核心组件,RetroArch是一个强大的前端界面,支持多种游戏模拟器核心(通过Libretro接口),这意味着用户可以在一个统一且用户友好的界面下玩到众多不同平台的经典游戏。

官网:https://lakka.tv/doc/

刷机安装方法详见:Switch刷机:安装Android系统和Linux系统

整体性能对比:Lakka更优

  • Lakka针对模拟游戏进行了系统级的优化,并预设了许多配置,有助于提升兼容性和性能。
  • Lakka在新版本中对Switch端口进行了重写,提升了性能。此外,Lakka还支持动态重新编译和图形堆栈更新,这些改进也有助于提升性能。
  • Lakka系统的一个显著优势在于它对Vulkan图形驱动的支持,而Switch版RetroArch只支持GL和Switch原生视频驱动。Vulkan作为一种现代、低开销的图形API,相比OpenGL(GL),在大多数情况下能够提供更好的性能和图形处理效率。
  • Switch版RetroArch可以使用最新版本,在模拟器核心上最全最新。而lakka因为适配原因,系统自带的RetroArch一般会落后几个版本,并且模拟器核心有缺失情况(缺失的是低性能已被兼容的核心,直接使用升级版本即可,无影响)。
  • 画质方面,两者都能支持到Switch屏幕的原生分辨率。

核心是否兼容:并不兼容

RetroArch 在不同平台上会有不同的核心格式要求,这是由操作系统和编译环境决定的。

在 Nintendo Switch 的大气层(Atmosphere)环境中, RetroArch 使用的是专为 Switch 设计的格式,即 .nro 格式,它是 Switch 定制固件(如大气层)中用于本机应用程序和插件的文件格式。

而在 Lakka 系统中,因为 Lakka 是基于 Linux 的操作系统,所以它使用的是与 Linux 兼容的核心格式,即 .so(共享对象)文件,这是Linux系统上用于动态链接库的标准格式。

整合2种方案:共享游戏ROM和配置、资源等文件夹

考虑到整合的游戏资源一般都是覆盖到Switch版的Retroarch目录,故推荐将Lakka的配置、资源等文件夹设置为共享Switch版的Retroarch目录。反之,如果将Switch版的Retroarch的文件夹设置为共享Lakka的目录也是类似操作方法。

  1. 在Lakka系统的主菜单中打开“设置”,选择“文件夹”选项。
  2. 将所有/storage开头的文件夹都改为/flash/retroarch下的同名目录。
  3. playlists目录不要更改,因为Lakka和Switch版Retroarch的根目录路径并不相同。
  4. 更改后在菜单选择“重启程序”后生效。
  5. 注意:所有/tmp开头的文件夹都不要更改设置,这些是Lakka镜像自带目录,更改后可能造成系统不兼容问题。

存储空间优化

  1. 如果只游玩少数几种模拟游戏机类型,可以将cores目录下的无关的模拟核心进行删除,例如只保留FC模拟器的整体占用不超过200M(含游戏和缩略图)。
  2. 清理不需要的游戏的缩略图等资源文件。
  3. 其他(不太占容量):
    • 不需要的模拟核心的关联配置等文件。
    • 同一个游戏一般会有多个平台版本或移植版本,只保留一个偏好的平台版本即可。

添加模拟器核心

Switch版RetroArch

RetroArch 官网下载Switch版本最新版后,解压覆盖到SD卡根目录即可完成程序版本和核心的整体更新。

如果只需要添加部分核心,则下载对应的RetroArch版本后,将其解压后的cores子目录中的所需核心拷贝到SD卡对应目录中,查找子目录,例如config文件夹等,寻找该核心配套的配置、资源等文件也拷贝到SD卡对应目录。

Lakka

配置连接WiFi后,选择在线更新,可以更新Lakka系统版本,其自带的RetroArch程序版本和核心都会被更新到最新自带版本。

Lakka系统中,不能单独更新 RetroArch 版本。但可以添加、更新核心,只需要将RetroArch的Linux版本(最好和自带RetroArch版本一致)的对应核心文件拷贝到 /lakka/storage/cores 目录下,即可添加新核心或更新同名核心。

注意:Lakka系统中缺失的是低性能已被兼容的核心,直接使用升级版本即可,无影响。比如,Arcade (FB Alpha 2012 CPS-1)直接使用Arcade (FinalBurn Neo)即可。

添加游戏

Lakka系统可以在线更新游戏,但是因为版权原因,只能下载到极少数自制游戏,例如贪吃蛇等。

自行寻找到ROM资源后,可以按照如下方法进行添加游戏:

  1. 拷贝 ROM 文件等

    • 游戏ROM通常是按照机型来分类在不同文件夹的,也可以按照喜好自行组织和命名文件夹。该文件夹命名很关键,之后缩略图资源等要和该文件夹命名保持一致。
    • 将游戏 ROM 文件夹拷贝到SD卡的根目录的ROM文件夹中。
    • 将游戏附带的各种资源的目录拷贝到/Retroarch目录下进行覆盖。
    • 如果没有该游戏类型的模拟器核心,需要先参照上文进行对应核心的安装。
  2. 尝试运行游戏

    • 游戏附带资源一般会附带palylist目录,拷贝安装后,就可以看到游戏列表。
    • 选择游戏列表中的游戏,点击运行,如果成功则结束游戏安装。
    • 如果没有附带游戏列表,或者游戏列表中的游戏点击后没反应、报错,则继续按照如下步骤,重新生成游戏列表。
  3. 在主菜单选择“导入”、“手动扫描”

    • 在Retroarch或Lakka的“主菜单”中,选择“导入”菜单,选择“手动扫描”选项。
    • 不推荐选择“扫描文件夹”选项。该选项会根据模拟器核心的数据库根据“游戏ROM名”进行匹配筛选,因为一般游戏ROM文件命名并不标准,从而会导致很多游戏无法导入。
  4. 指定扫描位置等

    • 选择要扫描的文件夹为游戏 ROM 文件夹。
    • 默认核心根据游戏ROM机型进行选择。如果不选择,则之后运行游戏时还需要手动再指定一次核心。
    • “递归扫描”默认保持开启。
    • “扫描压缩包内部”根据需要开启,比如NES核心不支持zip格式,对于以zip格式提供的NES ROM需要打开该选项,否则扫描不到游戏。
    • “覆盖现有列表”一般选择开启,这样可以覆盖掉原来的有问题的游戏列表。
    • 其他选项一般只需要保持默认值即可。
  5. 开始扫描

    • 确认选择后,RetroArch 将开始扫描指定的文件夹,查找所有支持的游戏 ROM,并将其添加到新建的游戏列表中。
    • 扫描完成后,就可以在 RetroArch 的游戏列表中看到新添加的游戏。
  6. 为另一个系统也添加游戏列表

    • Switch版Retroarch 和 Lakka 的根目录路径不一样,在一个系统操作完毕后需要再在另一个同样进行一遍游戏列表的添加操作。
    • 当添加的游戏列表比较多时,也可以使用复制游戏列表的方式:
      • 生成的游戏列表是playlists目录下同名的lpl文件,将该文件复制一份到另一个系统中,并批量替换其文件里的根目录路径为正确路径即可。
      • 有些低性能核心在Lakka系统中已经不存在,这些还需要将lpl文件的default_core_path、default_core_name字段更改为升级核心即可。
      • 主菜单选择“重启程序”之后生效。
  7. 修正游戏缩略图

    • 在Lakka系统中,可以在线更新缩略图资源,更新的是游戏封面、标题画面、游戏截图3图齐全。但是因为是根据游戏文件名进行数据库匹配,所以,大部分游戏都无法通过该方式匹配到。
    • 游戏资源一般会附带缩略图,即/retroarch/thumbnails下的文件夹,该图是根据文件名进行匹配的,如果没有正常显示则进行如下修正:文件夹名和游戏列表名保持一致,图片名和游戏名保持一致。
    • 对于游戏有子目录,且子目录内zip文件名和子目录名不一致,并且缩略图使用子目录名来命名的情况,使用下面的脚本进行修正。
    • 如果游戏文件名是缩写,而缩略图为正式游戏名等情况,无法统一处理,最好还是使用原游戏的游戏列表文件进行修改后使用,否则,只能手动一一重新命名label或缩略图,使2者一致。
    • 游戏资源没有附带缩略图资源,又想自己补全缩略图的,可以去 Lakka官方库 根据游戏机型、游戏名称来下载对应的缩略图,并按照上面所述来进行修正。

游戏列表文件的label命名修正脚本,对于游戏有子目录,且子目录内zip文件名和子目录名不一致,并且缩略图使用子目录名来命名的情况进行修正,将label名改为子目录名。
Lakka的SSH(以及Mac、Linux)适用,在playlists目录下新建fixLabelName.sh文件,将以下脚本内容粘贴到文件内,执行示例:./fixLabelName.sh CPS*.lpl MAME.lpl

#!/bin/sh

# 函数处理单个文件
process_file() {
    local file="$1"
    echo "Now is: ${file}"

    awk '
        BEGIN {inPath=0; inPrint=1}
        /"path": "/ {
            inPath=1;
            inPrint=0;
            print;
            gsub(/^[^{]*"path": "/, "", $0);
            gsub(/".*/, "");
            pathParts=split($0, parts, "/");
            newLabel=parts[pathParts-1];
        }
        inPath && /"label": "/ {
            gsub(/"label":.*/, "\"label\": \"", $0);
            print $0 newLabel "\",";
            inPath=0;
            inPrint=0;
        }
        inPrint {print}
        !inPrint {inPrint=1}
    ' "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"
    echo "Processed $file"
}

# 主程序开始
if [ "$#" -eq 0 ]; then
    echo "Usage: $0 file1 file2 ..."
    echo "Usage: $0 *.lpl"
    exit 1
fi

# 遍历所有提供的文件模式,手动匹配并处理实际文件
for pattern in "$@"; do
    # 使用ls命令配合通配符列出文件,注意这种方式在特殊字符处理上可能有限制
    for file in $(ls -d "$pattern" 2>/dev/null); do
        if [ -f "$file" ]; then
            process_file "$file"
        fi
    done
done

echo "All specified patterns have been processed."
添加特殊类型模拟游戏示例(尤其是Lakka中需要特别处理)
Dreamcast、NAOMI

需要BIOS配置,将该游戏附带的system文件夹覆盖到SD卡的/retroarch//lakka/storage/目录下。

如果已经在Switch版Retroarch中安装过,则可以在Lakka的SSH终端下执行如下命令进行复制:

# 拷贝Dreamcast的BIOS文件
cp -rf /flash/retroarch/system/dc* /storage/system/
# 拷贝NAOMI的BIOS文件
cp -rf /flash/retroarch/system/naomi* /storage/system/
PS

PS游戏所使用的CD映像,对应的格式是BIN+CUE。还需要检查cue文件的内容是否与bin名称匹配。

如果缺少CUE,可以这样创建它:

FILE "NameOfTheBin.bin" BINARY
  TRACK 01 MODE2/2352
    INDEX 01 00:00:00

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 08:38:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 08:38:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 08:38:04       87 阅读
  4. Python语言-面向对象

    2024-06-14 08:38:04       96 阅读

热门阅读

  1. 真正厉害的人,早就把生活调整成“过滤”模式

    2024-06-14 08:38:04       35 阅读
  2. 基于深度学习从2D图像中恢复3D图形

    2024-06-14 08:38:04       33 阅读
  3. WebForms Hashtable

    2024-06-14 08:38:04       28 阅读
  4. QtScript模块

    2024-06-14 08:38:04       35 阅读
  5. 探索Ubuntu:从入门到精通

    2024-06-14 08:38:04       30 阅读
  6. 【Kafka】SpringBoot整合Kafka详细介绍及代码示例

    2024-06-14 08:38:04       28 阅读
  7. Unity3D Shader数据传递语法详解

    2024-06-14 08:38:04       37 阅读
  8. AI学习指南机器学习篇-支持向量机超参数调优

    2024-06-14 08:38:04       28 阅读
  9. flink消费kafka时获取元数据信息

    2024-06-14 08:38:04       32 阅读
  10. 保存csv到mysql的通用脚本

    2024-06-14 08:38:04       23 阅读
  11. Shell 输入/输出重定向

    2024-06-14 08:38:04       28 阅读
  12. 人生结果等于思维方式乘以热情乘以能力

    2024-06-14 08:38:04       35 阅读