平时折腾天马整合包时,很多朋友会发现,自己新买的大容量硬盘很快就被动辄几百 GB 的“全家桶”塞满了。这些整合包数据量非常惊人,真正会被反复游玩的可能只有其中一小部分,但你又不想错过漂亮的封面墙、游戏简介和预览视频。于是一种新玩法出现了:把 ROM 全部删掉,只保留封面、简介和视频素材,让天马变成一个 50G 级别的“怀旧游戏数字博物馆”,只看不玩。这篇文章就围绕这个思路,梳理一套完整的精简与配置方案,包含目录结构拆解、批处理与 Python 脚本示例、常见问题排查,以及工程实践上的注意事项。如果你手头正好有一个庞大的天马整合包,又希望快速把它改造成适合浏览的媒体库,这篇文章可以直接照做。
需要提前说明的是,天马模拟器本身是一个开源前端方案,它不会自动包含任何游戏内容。ROM 文件的版权通常归属于原游戏公司或个人,请确保你只是对自己拥有合法备份、或已经获得授权的文件做整理。本文只讨论前端资源整理和目录配置方法,不提供任何 ROM 下载渠道。
1. 为什么有人会把天马整合包改成“只看不玩”版本
在开始动手之前,先搞清楚这个需求背后的原因,以及天马模拟器的基本工作原理,后面配置起来会更顺手。
1.1 天马模拟器前端到底是什么
天马模拟器并不是一个具体的游戏机模拟器,它本质上是一套基于 Pegasus Frontend 的整合方案。Pegasus 是一个跨平台的开源游戏前端,支持 Windows、Android、Linux 等系统。它的作用很简单:把游戏 ROM、模拟器核心、封面图片、标题截图、游戏简介、预览视频等信息集中展示在一个漂亮的图形界面里,用户可以像逛数字商店一样浏览自己的游戏库。
为了保证“开箱即用”,社区作者会把 Pegasus 前端、RetroArch 多合一模拟器、各个平台的模拟器核心、BIOS 文件、中文游戏列表、封面图、简介和预览视频打包在一起,做成一个庞大的“天马整合包”。这种整合包的优点是非常省心,下载解压就能玩;缺点是体积巨大,常见版本动辄 400G、600G,甚至超过 1T。很多人下载之后,发现硬盘根本没有足够空间放下完整版,或者自己只是喜欢浏览游戏封面和回忆片头动画,并不想真正花时间通关每款游戏。
1.2 “删 ROM、留媒体”的场景从哪里来
“删掉 ROM,只保留封面简介视频”这句话描述的场景很典型:用户希望保留天马前端的浏览体验,特别是封面墙、简介文字和视频预览,但又不想被几百 GB 的 ROM 文件占满硬盘。
我见过不少玩家会把天马整合包当成一本“游戏百科全书”来使用。下班之后打开前端,听听熟悉的片头音乐,看看当年的游戏封面,回忆一下童年,这种体验本身就有价值,不一定非要打开 ROM 去玩。如果只是浏览内容,ROM 文件其实是多余的,因为它们占用了绝大部分体积。一个包含 PS2、Wii、NGC 等大容量平台的整合包,ROM 可能是媒体素材体积的好几倍。删掉 ROM 之后,整个资源库可能从四五百 GB 缩减到 50G 左右,正好符合“只看不玩”的需求。
从技术角度看,这个操作完全可行。天马前端的浏览依赖的是 metadata.pegasus.txt 文件中描述的游戏条目,以及封面、视频等媒体文件;ROM 文件只负责“启动游戏”这一步。只要媒体资源完整,前端依旧可以展示一个漂亮且信息丰富的游戏库,只是点击“启动”时会提示找不到文件或无法运行。对“只看不玩”的用户来说,这正是想要的效果。
1.3 精简前后的体积对比与用户收益
这里给出一个粗略的经验参考值。在天马整合包中,ROM 文件通常占总体积的 80% 到 90% 以上,媒体素材(封面图、标题图、截图、预览视频)相对小很多。例如一个 300G 的整合包,ROM 可能占了 250G 左右,媒体素材大约 40G 到 50G,前端程序和模拟器核心约占几个 G。把这个整合包改造成“只看不玩”的精简版之后,体积可以压到 50G 左右。
对用户来说,收益主要体现在三个方面:第一,普通硬盘也能轻松容纳,不再需要为了一个资源库单独购买大容量机械硬盘;第二,启动前端的加载速度变快,因为不需要再扫描大量 ROM 文件;第三,这个精简包可以随意复制、分享给同样“只想看不想玩”的朋友,前提是你拥有对应的使用权限。接下来的章节,会围绕这个目标一步步操作。
2. 动手前先看懂天马整合包目录结构
想安全地删 ROM、留媒体,前提是准确理解天马整合包的目录结构。不同作者制作的整合包会有细节差异,但主流结构非常相似,通常包含三个重要区域:Pegasus 前端程序区、roms 游戏文件区、media 媒体素材区,以及一串 metadata.pegasus.txt 元数据文件。
2.1 顶层目录的三块核心内容
假设你解压了一个天马整合包,常见的目录结构长这样:
D:\SkyEmu\ ├─ Pegasus\ │ ├─ Pegasus.exe │ ├─ themes\ │ └─ ... ├─ roms\ │ ├─ fc\ │ │ ├─ 魂斗罗.nes │ │ └─ ... │ ├─ md\ │ │ └─ ... │ └─ ... ├─ media\ │ ├─ fc\ │ │ ├─ box_front\ │ │ ├─ video\ │ │ └─ ... │ └─ ... ├─ metadata\ │ ├─ fc.pegasus.txt │ ├─ md.pegasus.txt │ └─ ... └─ ra_data\ ├─ retroarch.exe ├─ cores\ └─ system\这里的Pegasus目录存放前端程序、主题和配置;roms目录按平台存放游戏 ROM 文件;media目录按平台存放封面、截图、视频等媒体资源;metadata目录存放每个平台对应的元数据文件;ra_data目录则是 RetroArch 模拟器核心和 BIOS 文件所在的位置。
对“只看不玩”的改造来说,核心动作非常清楚:保留Pegasus、media、metadata,并把roms下的真实 ROM 删除或替换成占位文件。在修改之前,建议先完整浏览一遍目录结构,确认你的整合包没有特殊设计,避免误删关键文件夹。
2.2 metadata.pegasus.txt 中游戏条目怎么定义
天马前端通过 metadata.pegasus.txt 文件来识别游戏条目,这是一种纯文本格式,基本语法是一行一个键值对。一个最小游戏条目通常包含game关键字、file路径、name名称和若干assets媒体属性。
下面是一个简化但典型的示例:
collection: FC extension: nes game: file: roms/fc/魂斗罗.nes name: 魂斗罗 (日版) description: 经典横版射击游戏,玩家扮演特种部队队员,突破重重防线。 developer: Konami publisher: Konami genre: 横向射击 release: 1987-02-09 players: 2 assets.box_front: media/fc/box_front/魂斗罗.png assets.video: media/fc/video/魂斗罗.mp4其中file字段告诉前端这个游戏条目对应的 ROM 文件路径,assets.box_front指向封面图,assets.video指向预览视频。Pegasus 在浏览模式中读取这些元数据,并在封面墙中显示游戏名、封面图和简介;当用户点击“启动”时,前端会根据file字段找到 ROM,并调用配置好的模拟器核心运行游戏。
所以,如果只是希望“能浏览、不能真正运行”,可以从file字段入手。最简单的做法是删掉真实的 ROM 文件,同时保留 metadata 中的描述信息和媒体路径;更稳妥的做法是保留一个 0 字节占位文件,确保前端仍能正确识别和显示游戏条目。
2.3 媒体资源是怎么和游戏条目绑定的
天马前端支持为每个游戏条目添加多种媒体资源。常见的有assets.box_front(正面封面)、assets.box_back(背面封面)、assets.screenshot(游戏截图)、assets.titlescreen(标题画面)、assets.video(预览视频)。在一个制作精良的天马整合包中,每个游戏几乎都配有封面图和一段短视频,这些资源共同构成了吸引人的浏览界面。
媒体资源通过相对路径绑定到游戏条目上。路径通常以整合包根目录作为基准,例如media/fc/box_front/魂斗罗.png表示根目录下的media/fc/box_front文件夹中的图片。在实际包内,路径命名可能略有区别,有些作者会使用media/FC大写目录,有些则会直接使用中文目录名。
在精简时,只要确保 metadata 中引用的媒体文件仍然存在,前端就能正常显示封面和视频。这也是为什么“删 ROM、保留媒体”能够成立:前端浏览体验依赖的是 metadata 和 media,而不是 roms 中的文件。理解了这一点后,下面就可以设计具体的精简方案。
3. 三种“只看不玩”精简方案选型
真正操作时,有不同的精简思路。有的方案追求绝对干净,有的方案更注重兼容性。下面对比三种常见方案,你可以根据自己的需求选择。
3.1 方案 A:直接删除 ROM 文件
方案 A 最简单直接:打开roms目录,把里面的游戏文件全部删除,保留media和metadata不动。操作完成后,前端启动时会读取 metadata 中定义的游戏条目,封面和简介正常展示;当你点击某个游戏,模拟器会因为找不到 ROM 文件而报错。
这个方案的优点是非常省事,不需要修改任何 metadata 文件,也不会因为改错格式导致前端显示异常。缺点也很明显:部分 Pegasus 版本在扫描集合时,会把“没有对应 ROM 文件”的游戏条目判定为不可用,甚至直接不显示;另外,如果整合包内置了游戏列表生成工具,工具可能认为游戏库不完整。因此,方案 A 比较适合那些“即使游戏条目不显示也没关系”的用户。
@echo off setlocal enabledelayedexpansion set "ROM_DIR=D:\SkyEmu\roms" if not exist "%ROM_DIR%" goto :eof for /r "%ROM_DIR%" %%F in (*.nes *.sfc *.md *.bin *.iso *.zip *.7z) do ( del "%%F" echo removed: %%F ) endlocal前面这段批处理会把常见扩展名的 ROM 文件直接删除。但要注意,它也会误删 BIOS 和部分小容量数据文件,所以执行前一定先确认roms目录下没有需要保留的 BIOS 或存档文件。
3.2 方案 B:占位文件法,保留可浏览性
方案 B 是更推荐的思路:不是直接删除 ROM,而是把真实的 ROM 文件替换成同名的 0 字节占位文件。这样 metadata 中记录的file路径仍然存在,Pegasus 会认为游戏条目对应的文件是存在的,于是正常展示封面、简介和视频;当你点击启动时,模拟器尝试加载 0 字节文件,最终会因为文件内容无效而进入报错或返回界面。
这种方案的优点是兼容性最好,不需要修改 metadata,不会因为游戏条目缺失导致前端展示不完整;缺点是文件夹中仍然会有大量小文件,虽然不占空间,但文件数量很多,在复制或扫描时会稍微影响效率。
实现这个方法,可以在命令行中用脚本完成。下面是 Windows CMD 下的批处理方式:
@echo off setlocal enabledelayedexpansion set "ROM_DIR=D:\SkyEmu\roms" if not exist "%ROM_DIR%" goto :eof for /r "%ROM_DIR%" %%F in (*.nes *.sfc *.md *.bin *.iso *.zip *.7z) do ( if %%~zF GTR 10485760 ( del "%%F" type nul > "%%F" echo replaced: %%F ) ) endlocal这段代码会遍历roms目录,把所有大于 10MB 的文件替换成 0 字节文件。设置 10MB 阈值主要是为了保护 BIOS、存档等小体积但可能需要的文件。如果你希望覆盖更彻底,可以把阈值调低,或者增加更多扩展名。
3.3 方案 C:重写 metadata,去除 launch 能力
方案 C 更彻底,也是工程上最“干净”的做法:重新整理 metadata.pegasus.txt,只保留游戏名称、简介和媒体资源字段,去掉file字段或把file指向一个空路径。这样前端看到的是一个“只能浏览、没有启动目标”的游戏条目,从逻辑上就不具备启动能力。
不过方案 C 对 metadata 的格式要求比较高。根据 Pegasus 文档,file字段通常用于标明可执行文件路径,如果完全省略,不同版本的前端行为可能不一致。有的版本会正常显示条目,有的版本则认为该条目不完整而跳过。所以如果你想采用方案 C,最好先在小范围内做实验,确认当前 Pegasus 版本的行为,再决定是否要批量重写所有 metadata。
game: name: 魂斗罗 (日版) description: 经典横版射击游戏,玩家扮演特种部队队员,突破重重防线。 assets.box_front: media/fc/box_front/魂斗罗.png assets.video: media/fc/video/魂斗罗.mp4如果实验后前端不显示该条目,可以退回方案 B,或者把file字段改为:
file: roms/fc/empty/魂斗罗.nes并确保roms/fc/empty/目录中存在一个 0 字节的占位文件。这样既保留条目,又不会真正运行游戏。
3.4 方案对比表格
| 方案 | 操作难度 | ROM 空间 | 游戏条目显示 | 启动游戏 | 误删风险 |
|---|---|---|---|---|---|
| A 直接删除 ROM | 低 | 不占用 | 可能不显示 | 失败 | 中 |
| B 占位文件法 | 低 | 不占用 | 正常显示 | 失败 | 低 |
| C 重写 metadata | 高 | 不占用 | 取决于版本 | 失败 | 低 |
综合来看,方案 B 是最适合“只看不玩”需求的方案。它既能保留完整的游戏库展示效果,又能在前端浏览时获得最佳体验。如果你希望进一步精简 metadata 内容,也可以在方案 B 的基础上,再对 metadata 做去file的清理实验。
4. 完整实战:把 300G 整合包瘦身成 50G 预览版
下面进入完整实战环节。这里以一个虚拟的整合包目录结构为例,演示如何一步步把几百 GB 的资源库改造成“只看不玩”的预览版。操作过程中会用到 Windows 批处理、Python 脚本,以及 Pegasus 前端的基本验证方法。
4.1 第一步:复制目录与备份
不管采用哪种精简方案,都不建议直接在原始整合包上操作。最理想的做法是先复制一份完整包再处理,但整合包体积巨大,复制几百 GB 很耗时间。更合理的做法是:备份 metadata 目录和 Pegasus 前端配置,然后直接对原包操作。这样即使出错,也能恢复到原始的元数据状态。
备份步骤如下:
mkdir D:\SkyEmu_Backup xcopy D:\SkyEmu\metadata D:\SkyEmu_Backup\metadata /E /I xcopy D:\SkyEmu\Pegasus D:\SkyEmu_Backup\Pegasus /E /Ixcopy会把metadata和Pegasus目录完整复制到备份目录。后续不管是误删了 metadata,还是对前端配置做了不可逆的修改,都可以从备份目录恢复。需要说明的是,备份这两个目录并不会占用太多空间,因为 metadata 只是文本文件,Pegasus 目录中也主要是程序文件和主题资源。
如果你想换一种更省心的方式,也可以使用文件版本管理工具,比如 Git,对 metadata 目录做版本追踪。这样每次修改前先提交一次,之后随时可以回滚。
4.2 第二步:清理 roms 目录中的大文件
备份完成后,开始清理 ROM 文件。这里采用方案 B 的“占位文件法”,既保留游戏条目的完整性,又释放磁盘空间。
首先在整合包根目录下打开命令提示符或 PowerShell,先定位到roms目录,确认里面的文件扩展名分布:
dir /s /b D:\SkyEmu\roms | findstr /i "\.nes$ \.sfc$ \.md$ \.bin$ \.iso$ \.zip$ \.7z$"也可以直接查看目录大小:
powershell -Command "Get-ChildItem -Path 'D:\SkyEmu\roms' -Recurse | Measure-Object -Property Length -Sum | Select-Object @{Name='SizeGB';Expression={[math]::Round($_.Sum / 1GB, 2)}}"下一步是把所有大于 10MB 的 ROM 文件替换为 0 字节占位文件。使用前面的批处理脚本即可:
@echo off setlocal enabledelayedexpansion set "ROM_DIR=D:\SkyEmu\roms" if not exist "%ROM_DIR%" ( echo roms directory not found. goto :eof ) for /r "%ROM_DIR%" %%F in (*.nes *.sfc *.md *.bin *.iso *.zip *.7z) do ( if %%~zF GTR 10485760 ( del "%%F" type nul > "%%F" echo replaced: %%F ) ) echo done. endlocal脚本执行后,磁盘空间会迅速释放。注意type nul > "%%F"会创建一个 0 字节的新文件,并且保留原文件名,所以 metadata 中的路径仍然有效。如果你希望彻底不留任何文件,可以把这一句改成del "%%F",但必须接受“游戏条目可能不显示”的风险。
4.3 第三步:保留 media 目录中的封面、简介、视频
roms 清理完成后,下一步是确认media目录是完整的。这一步不需要做太多操作,但要检查 metadata 中引用的媒体文件是否存在。
你可以在整合包根目录运行一个简单的 PowerShell 命令,统计media目录下的文件总大小:
powershell -Command "Get-ChildItem -Path 'D:\SkyEmu\media' -Recurse | Measure-Object -Property Length -Sum | Select-Object @{Name='SizeGB';Expression={[math]::Round($_.Sum / 1GB, 2)}}"正常情况下,这个大小就是你精简后的主体体积。如果media目录包含大量视频文件,那么 50G 的规模是比较合理的。如果发现media目录意外缺少某个平台的封面或视频,后续需要补充或修改 metadata 路径,否则对应平台的游戏条目会显示空封面。
如果目录结构支持,你还可以清理media目录中的备份文件、缩略图缓存和多余的主题资源,进一步缩小体积。不过要谨慎,尽量不要删除media中任何被 metadata 引用的文件。
4.4 第四步:处理 metadata 中的 file 路径
方案 B 不需要修改 metadata,因为占位文件保留了原文件名。但如果你的整合包在清理后出现游戏条目不显示的问题,可以尝试打开对应的 metadata.pegasus.txt,检查file字段是否指向了不存在的路径。
示例检查方式:打开metadata\fc.pegasus.txt,看到类似以下内容:
file: roms/fc/魂斗罗.nes然后确认D:\SkyEmu\roms\fc\魂斗罗.nes是否存在。如果存在且是 0 字节文件,说明占位文件生效,前端可以正常展示条目。如果文件不存在,说明脚本没有覆盖到这类文件,需要补充扩展名,或直接创建空目录和空文件。
mkdir D:\SkyEmu\roms\fc\empty 2>nul type nul > "D:\SkyEmu\roms\fc\empty\魂斗罗.nes"对于少量缺失文件,手工补一下很快。如果缺失数量很多,就需要写一个批量工具来检查和修复,下一章会给出 Python 脚本。
4.5 第五步:启动 Pegasus 验证效果
完成前四步后,启动 Pegasus 前端,检查是否能顺利进入浏览界面。正常情况应该是:封面墙或游戏列表能显示出完整的游戏条目,每个条目都有封面图和文字简介,点击游戏后能播放预览视频;当你尝试点击“启动”按钮运行时,前端要么提示找不到模拟器核心,要么提示 ROM 文件错误,最终无法进入游戏。
验证步骤可以这样安排:
- 双击
Pegasus\Pegasus.exe启动前端。 - 进入各个平台合集,确认游戏条目仍然存在。
- 随机点开几个游戏,查看封面图、简介、视频是否正常显示。
- 点击“启动”或“Play”按钮,确认游戏不会意外运行。
- 查看磁盘空间,确认整合包已经从几百 GB 缩减到约 50G。
如果前端在扫描阶段就卡住或一直转圈,可能是 metadata 中引用的 ROM 路径不存在,且占位文件没有生效。此时回到第四步,检查缺失文件即可。
5. 批量脚本:用 Python 自动完成瘦身与校验
如果整合包中游戏数量非常多,手工检查和修改 metadata 会很痛苦。下面提供两个 Python 脚本,分别用于“批量替换 ROM 为占位文件”和“校验媒体资源完整性”。脚本思路通用,你可以根据实际目录结构调整。
5.1 清理脚本设计思路
脚本需要解决三个问题:一是准确读出 metadata 中引用的文件路径;二是根据路径执行删除和占位操作;三是避开 BIOS、存档等不应该被清空的小文件。实现时使用 Python 标准库即可,不需要额外安装第三方依赖。
脚本流程如下:
- 遍历
metadata目录下的所有.pegasus.txt文件。 - 用正则表达式匹配
file:开头的行,提取 ROM 相对路径。 - 将相对路径拼接成绝对路径。
- 判断文件是否存在、是否大于预设阈值。
- 满足条件时删除原始文件并创建 0 字节占位文件。
- 最后打印处理统计信息。
为了避免误删 BIOS 文件,脚本可以排除路径中包含bios、system、save等关键词的文件。你可以在脚本开头维护一个排除关键词列表。
5.2 Python 脚本:删除 ROM 并生成占位文件
import re import os from pathlib import Path BASE_DIR = Path(r"D:\SkyEmu") METADATA_DIR = BASE_DIR / "metadata" ROM_FILE_THRESHOLD = 10 * 1024 * 1024 # 10MB # 需要排除的目录关键词 EXCLUDE_KEYWORDS = ("bios", "system", "saves", "save", "cheats") file_pattern = re.compile(r"^file:\s*(.+)$", re.IGNORECASE) def should_exclude(path: Path) -> bool: lower_parts = [part.lower() for part in path.parts] return any(kw in " ".join(lower_parts) for kw in EXCLUDE_KEYWORDS) def trim_rom(rom_path: Path): if should_exclude(rom_path): print(f"skip excluded: {rom_path}") return if not rom_path.exists(): print(f"not exists: {rom_path}") return if rom_path.stat().st_size <= ROM_FILE_THRESHOLD: print(f"skip small file: {rom_path}") return try: rom_path.unlink() rom_path.touch() print(f"replaced: {rom_path}") except OSError as exc: print(f"error: {rom_path}: {exc}") if __name__ == "__main__": for meta_file in METADATA_DIR.glob("*.pegasus.txt"): print(f"parsing: {meta_file.name}") for line in meta_file.read_text(encoding="utf-8", errors="ignore").splitlines(): m = file_pattern.match(line.strip()) if m: rel = m.group(1).strip() # 跳过外部路径或绝对路径 if ":" in rel or rel.startswith("/"): continue rom_path = (BASE_DIR / rel).resolve() trim_rom(rom_path)这段脚本执行后,会把所有被 metadata 引用的大体积 ROM 替换成 0 字节占位文件。路径中的中文、空格都能正常处理。如果你使用的整合包目录结构不是BASE_DIR / file这种基准路径关系,需要根据实际情况调整拼接逻辑。
5.3 Python 脚本:检查 metadata 资源完整性
清理 ROM 之后,还需要确保封面和视频资源没有丢失。下面的脚本会遍历 metadata 中的assets字段,并检查对应媒体文件是否存在。如果存在缺失,脚本会输出缺失清单,方便后续补充。
import re from pathlib import Path BASE_DIR = Path(r"D:\SkyEmu") METADATA_DIR = BASE_DIR / "metadata" asset_pattern = re.compile(r"^assets\.\w+:\s*(.+)$", re.IGNORECASE) missing_assets = [] total_checks = 0 if __name__ == "__main__": for meta_file in METADATA_DIR.glob("*.pegasus.txt"): for line in meta_file.read_text(encoding="utf-8", errors="ignore").splitlines(): m = asset_pattern.match(line.strip()) if not m: continue rel = m.group(1).strip() if ":" in rel or rel.startswith("/"): continue asset_path = BASE_DIR / rel total_checks += 1 if not asset_path.exists(): missing_assets.append((meta_file.name, rel)) print(f"total asset references: {total_checks}") print(f"missing asset count: {len(missing_assets)}") for meta_name, rel in missing_assets[:50]: print(f" {meta_name}: {rel}")这个脚本只做检查和报告,不会删除任何文件,可以放心运行。如果你发现大量缺失,很可能是 metadata 中使用了与当前整合包不同的资源目录命名规则,需要对比原包后做批量替换。
5.4 运行结果示例
假设脚本运行后的输出如下:
parsing: fc.pegasus.txt replaced: D:\SkyEmu\roms\fc\魂斗罗.nes replaced: D:\SkyEmu\roms\fc\超级玛丽.nes parsing: md.pegasus.txt replaced: D:\SkyEmu\roms\md\幽游白书.md ... total asset references: 8320 missing asset count: 2 fc.pegasus.txt: media/fc/box_front/冒险岛.png md.pegasus.txt: media/md/video/太空战士.mp4对于缺失的 2 个媒体文件,你可以判断是因为原整合包本身缺失,还是因为文件名大小写、编码问题导致的路径不一致。如果是原包缺失,可以忽略;如果是编码问题,需要把 metadata 和实际文件名统一成同一种编码规范。
6. 常见问题与排查思路
在实际操作中,你会遇到各种奇怪的现象。下面整理几个高频问题,包含原因分析和解决思路。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 清理后游戏条目直接消失 | Pegasus 扫描时判断 file 文件不存在,跳过条目 | 使用 0 字节占位文件法,确保 file 指向存在 |
| 封面图能显示,视频无法播放 | 视频文件缺失,或 metadata 中 video 路径不对 | 检查 assets.video 对应的文件是否存在,核对大小写 |
| 整个前端启动后一直转圈 | metadata 中引用了大量不存在的路径,扫描缓慢 | 用 Python 脚本校验 metadata,修复或删减缺失条目 |
| 体积没有明显变小 | 还有未引用的 ROM 或冗余 BIOS、缓存文件 | 用磁盘扫描工具找出大文件,确认是否被 metadata 引用 |
| 删除文件后磁盘空间没有释放 | 文件被放入回收站,或仍有进程占用 | 清空回收站,关闭 Pegasus 和 RetroArch 进程 |
| 点击启动后模拟器报错 | 0 字节占位文件无法被模拟器识别 | 这是“只看不玩”的预期行为,不影响浏览 |
如果是“启动后模拟器报错”的情况,其实不需要处理,因为那就代表你已经成功把一个完整整合包改成了“只看不玩”的预览版。如果你希望保留少量可玩的游戏,可以在清理前先把这几个游戏手动复制到另一个目录,并在 metadata 中把它们的file路径指向新目录。
还有一类问题是脚本误删造成的。例如有人直接删除整个roms目录,结果连 RetroArch 需要的 BIOS 文件也一并删了。这类问题最好预防,而不是事后修复。建议在清理前先用脚本输出“将被替换文件清单”,人工确认清单里没有 BIOS、存档、金手指等关键文件后,再执行清理。
# 输出待处理文件的预览清单 import re from pathlib import Path BASE_DIR = Path(r"D:\SkyEmu") METADATA_DIR = BASE_DIR / "metadata" file_pattern = re.compile(r"^file:\s*(.+)$", re.IGNORECASE) for meta_file in METADATA_DIR.glob("*.pegasus.txt"): for line in meta_file.read_text(encoding="utf-8", errors="ignore").splitlines(): m = file_pattern.match(line.strip()) if m: rel = m.group(1).strip() if ":" in rel or rel.startswith("/"): continue p = BASE_DIR / rel if p.exists() and p.stat().st_size > 10 * 1024 * 1024: print(p)如果你把这段脚本的输出保存成to_trim.txt,再人工扫一眼,就能大幅降低误删风险。
7. 工程实践与法律提醒
把整合包瘦身成“只看不玩”的过程,看起来只是删文件,但如果想做得稳定、可维护,还是有一些工程层面的经验可以总结。
7.1 保留可玩性的优雅做法:目录 junction / 符号链接
有些用户只是暂时想省空间,但未来可能又想玩某个游戏。针对这种情况,不建议直接删除 ROM,而是把 ROM 移动到另一块硬盘或移动硬盘,然后在原整合包位置创建目录链接。
Windows 下可以用mklink /J创建目录链接:
mklink /J D:\SkyEmu\roms E:\SkyEmu_ROMs\roms这样做的效果是:天马前端看到的roms目录仍然存在,所有 metadata 路径都不用修改;平时如果不挂载移动硬盘,前端里的游戏条目因为找不到文件而无法启动,浏览功能不受影响;需要玩游戏时,插上移动硬盘,就可以继续完整体验。
这种方式适合“偶尔玩一下”的用户,避免了做两个整合包的麻烦。如果你只是追求纯粹的“只看不玩”,直接使用占位文件法更省心。
7.2 如何维护“只看不玩”库的长期一致性
整合包在长时间使用后,可能会出现媒体文件缺失、metadata 路径错误等问题。为了保持一致性,建议你建立一套简单的维护流程:
- 每次新增或删除游戏时,都同步检查 metadata 中的
file和assets是否仍然有效。 - 使用脚本定期校验媒体资源,把缺失清单输出成日志。
- 对 metadata 目录做版本控制,可以用 Git 或普通备份目录,确保改坏了能回滚。
- 如果整合包需要分享给其他人,建议附带一份“体积精简说明”,解释为什么没有本体 ROM。
这些习惯可以显著降低后期维护成本,尤其当游戏数量达到几千个时,手工检查几乎不现实,必须依赖脚本。
7.3 版权与合规边界
最后必须认真强调版权问题。天马整合包中的前端程序、主题资源、模拟器核心通常遵循各自的开放许可,但游戏 ROM、部分 BIOS、游戏封面和视频素材不一定允许随意传播。本文讨论的“删 ROM、留媒体”本质上是对已有整合包做文件整理,你不能因为做了精简,就认为自己拥有了这些内容的分发权。
在实际使用中,建议始终遵循几个原则:第一,只处理你拥有合法备份、或已经获得授权的内容;第二,不要公开分享整合包中的 ROM 或未经授权的媒体文件;第三,如果整合包作者明确声明了使用限制,请遵守作者的规定。技术本身没有善恶,但使用方式需要自己负责。
8. 总结与下一步扩展
到这里,一个“只看不玩”的天马精简版就改造完成了。你掌握了天马整合包的目录结构、metadata.pegasus.txt 的基础语法、ROM 与媒体资源的绑定关系,也学会了用批处理和 Python 脚本批量删除 ROM、生成占位文件、校验媒体资源完整性。如果你的目标是只浏览封面、简介和预览视频,那么这套方案可以帮你把整合包体积从几百 GB 压缩到 50G 左右。
下一步可以继续研究几个方向:一是学习 Pegasus 前端的主题配置,把精简包界面进一步美化,做成类似数字博物馆的展示墙;二是研究 RetroArch 核心和 BIOS 的配置逻辑,理解“可玩版”和“只看不玩版”之间的差异,这样未来需要恢复某几个游戏的游玩功能时更加得心应手;三是尝试为精简包设计一套自用的数据校验脚本,把 metadata 和媒体文件的完整性检查自动化。
实际操作时,请一定先备份 metadata 和前端配置,再执行任何删除操作。如果你在精简过程中遇到游戏条目不显示、视频无法播放、体积压缩不明显等问题,优先回到 metadata 和占位文件这两条主线上排查。希望这篇教程能帮你省下几百 GB 的硬盘空间,同时还能保留一个漂亮又好用的怀旧游戏资料库。