打造专属 Switch 模拟游戏机

2024-06-14 02:44

本文主要是介绍打造专属 Switch 模拟游戏机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 2种方案
        • Switch版RetroArch
        • Lakka系统
      • 整体性能对比:Lakka更优
      • 核心是否兼容:并不兼容
      • 整合2种方案:共享游戏ROM和配置、资源等文件夹
      • 存储空间优化
      • 添加模拟器核心
        • Switch版RetroArch
        • Lakka
      • 添加游戏
        • 添加特殊类型模拟游戏示例(尤其是Lakka中需要特别处理)
          • Dreamcast、NAOMI
          • PS

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 ]; thenecho "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); doif [ -f "$file" ]; thenprocess_file "$file"fidone
doneecho "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" BINARYTRACK 01 MODE2/2352INDEX 01 00:00:00

这篇关于打造专属 Switch 模拟游戏机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059151

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT