📖 本文由 Batocera 官方 Wiki 翻译整理,内容可能随版本更新而变化。


Batocera 原生 CRT 画面输出指南

【注意】本页面内容已过时,不再建议使用。
目前,针对最新的 x86_64 架构 Batocera 版本,我们已经推出了自动化 CRT 设置脚本(Automated CRT setup script)。请直接参考 Batocera CRT 脚本官方 Wiki 进行配置。

⚠️ 只有当你需要对旧系统(Legacy setups)进行故障排查时,才建议参考本文内容。对于所有新安装的系统,请务必遵循 GitHub 上的脚本说明。


适用范围与软硬件门槛

本指南仅适用于在 x86_64 架构上运行的 Batocera v32 版本。
* 树莓派(Raspberry Pi)用户:请前往专门的树莓派 CRT 页面。
* v30/v31 或 x86 架构用户:请参考旧版指南。
* 心理准备:这是一篇深度技术文章,全文约 9000 字,非核心硬核玩家请谨慎阅读。


硬件要求:寻找纯净的模拟信号

只要你的硬件支持,Batocera 就能原生输出模拟信号(Analogue signal)。

核心要求:
你的显卡必须拥有 VGADVI-I 接口。然而在现代显卡上,这类接口正变得极其稀有。如果你使用的是主板上的接口,则需要 CPU 具备集成显卡支持,且信号未经过数模转换器(DAC)的魔改,同时可能还需要特定的 BIOS 设置。

生活化类比: 这就像是听黑胶唱片。原生模拟输出追求的是从唱片(显卡)到喇叭(显示器)之间最纯粹、不经过任何数字加工的波形。而现代显卡(如只有 HDMI/DP 接口的显卡)就像是蓝牙耳机,它们自带的“语速”太快(带宽太高),老式大头显示器(CRT)根本听不懂它们在说什么。


关于转换器的重要提示

虽然你可以使用主动式转换器(Active converter)将数字信号转换为模拟信号,但那并不属于本教程讨论的“原生输出”。

【注意】本指南完全专注于如何将显卡产生的纯模拟信号直接传输到显示器。本文中涉及的所有配置参数与上述的主动式转换器并不兼容


推荐视频

(建议在操作前观看相关演示视频,以获得更直观的感受)

预备知识与安全警告

在正式动手之前,强烈建议你通过以下资料补充一些背景知识。虽然有些是针对 Windows 或实机硬件的,但其中的技术术语和原理在 Batocera 中同样适用。

推荐观看:
* Displaced Gamers 关于 240p 历史的精彩视频:它解释了早期游戏机常用的 240p 信号背景,以及为什么会出现“扫描线(Scanlines)”这种极具年代感的画面效果。

推荐阅读:
* RetroRGB 的 RGB 指南:虽然它侧重于将老游戏机连接到现代显示器,但它详细介绍了本教程中会反复用到的术语,并深入讲解了模拟信号标准。
* buttersoft 在 AussieArcade 论坛的帖子:这是一份关于如何将 Windows 电脑连接到标准定义(SD)CRT 电视、监视器或街机显示器的指南。这份文档比本教程更具技术深度,非常适合进阶研究。


前言与安全风险告知

【警告】这并非危言耸听:与数字信号不同,模拟信号及其接收设备(如老式电视机)通常没有任何自我保护限制

生活化类比: 数字信号就像是带有限速器的电动车,你怎么踩油门它都不会失控;而模拟信号就像是一台功率巨大的老式赛车,如果你输入了错误的参数,可能会导致显示器损毁、保险丝熔断、老旧电容过热,甚至引发火灾。

在尝试将旧设备连接到系统前,请务必进行充分的研究。 虽然本指南包含了一些安全预防措施,但保护你和设备安全的最终责任仍由你自己承担。


致谢名单

如果没有以下先驱者的贡献,本指南将无法诞生:
* jfroco:在 Batocera 模拟输出方面的开创性工作。
* rtissera:凭借其专业知识和热情,为系统加入了 15 KHz 补丁(15 KHz patches)
* Calamity:贡献了其深厚的知识库、驱动程序、工具以及 GroovyMame 和 Switchres 等项目。
* Substring:在 GroovyArcade、SDL、KMS 等底层技术上的辛勤付出。
* D0023R (Doozer):持续致力于为 Linux 内核添加 15 KHz 支持。
* dmanlcf:确保 Batocera 的 15 KHz 补丁能与时俱进。

  • 感谢 RionAtari 编纂了本指南。

术语表(Glossary)

模拟信号和 CRT 相关标准的领域非常复杂,有时甚至会产生误导。在本指南中,我们不会深挖每一个细节,但为了避免后续操作中产生困惑,我们将一些核心术语按字母顺序整理如下。在阅读过程中,你可以随时回到这里查阅:

  • 主动式转换器(Active converters):这是一种用来转换信号的“小盒子”。它们内部装有微型处理器和内存(RAM),通过数字方式处理图像后再输出。

    • 生活化类比:就像是一个“同声传译员”,虽然能听懂,但翻译过程会产生一点延迟(Lag)。
    • 【注意】:这种方式不属于“原生输出”。本指南假设你没有使用这种盒子,因为它们会完全接管信号转换过程,导致 Batocera 无法精准控制信号。它们通常是方盒子形状,且大多需要额外供电。
  • BNC 线缆(BNC cables):这是一种标准的同轴电缆,可以传输各种模拟信号。在我们的应用场景中,它主要负责传输 RGB 视频信号

    • 应用场景:普通家用电视很少见,但在专业/广播级监视器(PVM/BVM)上非常普遍。你通常需要一个特定的被动式适配器(Passive adapter),将 VGA 转接为对应数量的 BNC 接头。
    • 【提示】:这是专业人士的“心头好”。
  • 分量视频线(Component video cables):也就是常见的那种红、绿、蓝三色接头线。

    • 【注意】:千万不要把它和发音相似的“复合视频线(Composite,即单根黄头线)”搞混。虽然它的线头也是红绿蓝三色,但这纯属巧合,它传输的是 YPbPr 信号,和我们常说的 RGB 信号完全是两码事。
    • 生活化类比:就像三根乱成一团的“意面”,连接时一定要对准颜色。

配置步骤:开启你的 CRT 之旅

第一步:确认硬件连接
确保你使用的是纯被动线缆(直接物理连接),而不是带芯片的主动式转换盒。

第二步:查阅术语对号入座
根据你手中的显示设备(是普通电视、PVM 还是街机框体),在术语表中找到对应的接口标准。

第三步:准备进入系统调试
在确认物理连接无误后,我们将在后续章节进入 Batocera 的系统内部进行具体的参数调整。

  • 复合信号(Composite signal):这是一种将亮度(Luminance)和色彩(Color)频道合并到一根电线中传输的模拟信号。它是通过复合视频线来传输的。
  • 复合视频线(Composite video cable):就是那个标志性的“黄色接头线”。不用多说,懂的都懂。虽然它画质一般,但那种怀旧感确实无可替代。
  • DisplayPort(DP)接口:现代显卡上最常见的数字视频接口,兼容 DP 和 HDMI 信号。
    • 【注意】:该接口无法直接发送原生模拟信号,因此不推荐用于 CRT 显示器。不过,如果你有特定的硬件设备,也可以通过一些变通方法来实现(本指南后续会详细说明)。
  • DVI-I 接口(DVI-I port):这是显卡上那个 29 针的接口,具备输出模拟信号的能力。你通常能在 VGA 接口旁边找到它,但在较新的显卡上它已经消失了。
    • 【重要提示】:绝对不要把它和外观几乎一样的 DVI-D 接口混淆!DVI-D 只能传输数字信号。
    • 分辨方法:观察接口侧面的那个扁平插槽,DVI-I 在扁平插槽的上下方各有两个额外的插针孔,而 DVI-D 则没有。另外,纯模拟的 DVI-A 接口也适用,但它极其罕见。
  • EDID(数据标识码):全称是“扩展显示标识数据(Extended Display Identification Data)”。这是一种数字元数据信号,显示设备通过它向视频源(也就是你的 Batocera 电脑)“自我介绍”,告知自己的分辨率等参数。

    • 生活化类比:它就像是显示器的“名片”。现代显示器都有这张名片,Batocera 拿到后就能自动切换到合适的画面。
    • 【注意】:部分支持 VGA 的 CRT 监视器拥有 EDID,但并非全部。由于该标准是在 1994 年引入的,在此之前生产的显示器通通没有这张“名片”。
  • 行扫描频率(Horizontal scan rate):通常以千赫兹(kHz)为单位。它代表显示器每秒钟画出水平线条的次数。

    • 生活化类比:这就像是一个粉刷匠刷墙的速度。行扫描频率决定了他横着刷一排有多快,而我们常说的“垂直刷新率”则决定了他刷完一整面墙要多久。
  • 被动式适配器/线缆(Passive adapter/cables):这类线缆非常简单,仅仅是将一种接口的物理规格转接成另一种。它们内部没有任何电子电路,所有的信号处理工作都由输出信号的机器完成。
    • 【注意】:被动式线缆只能实现“模拟转模拟”或“数字转数字”,无法直接跨越模拟与数字之间的鸿沟。它们本质上就是几根简单的导线。
  • RGB 视频信号(RGB video signal):在此语境下,指的是一种模拟信号,它为红(Red)、绿(Green)、蓝(Blue)三原色分别设立了独立的传输通道。
    • 【提示】:RGB 信号默认与分量、复合或 S-Video 信号不兼容。虽然它们本质上都是模拟信号,但如果你想在它们之间转换,必须使用特定的转码器(Transcoder)。
  • SCART 接口(SCART):这是一种拥有 21 针的巨大接口,旨在取代标准的复合视频输出。它在欧洲和日本非常流行,但在其他地区较为罕见。
    • 功能:它能同时传输模拟视频和音频信号。SCART 原生支持 RGB 视频信号,同时也向下兼容分量(YPbPr)、复合及 S-Video 信号。那个硕大的插头,是很多老玩家心中“高画质”的代名词。
  • S-Video 接口(S-video port):这是复合视频(黄头线)的微升阶版本。它将色彩和亮度信号分成了两根独立的导线传输,从而减少了溢色和杂影。

    • 现状:虽然在 DVD 播放机上很常见,但实际画面提升感并不算巨大。它最显著的特征就是那个 4 针的小圆头连接器。
  • S-Video 信号(S-video signal):这是一种模拟信号。本质上它和复合信号(就是那种黄头线信号)完全一样,唯一的区别是它把色彩和亮度信号“分家”传输了。

    • 生活化类比:复合信号像是把菜和饭搅在一起的“盖饭”,而 S-Video 则是把菜和饭分开放的“分体快餐”。虽然食材一样,但分开放能避免味道串门(减少色彩干扰)。从硬件上把两者互相转换很简单,但前提是你的显示设备得能认出它是哪种“吃法”。
  • 射频调制器(RF modulator):这是一个能把复合、分量或 RGB 模拟信号转换成“无线电频率”的设备。

    • 应用场景:如果你的老电视只有一个圆形的座子(天线输入口),那你就必须用到它。
    • 【提示】:以前的录像机(VCR)通常自带这个功能,如果你手头有旧录像机,完全可以把它当成调制器来用。
  • 三极 A/V 复合线(Three-pole A/V composite cable):这是一种比较“不讲武德”的现代模拟线缆,它强行把视频信号塞进了一个 3.5mm 的耳机孔里,另一头则是常见的 RCA 莲花头。

    • 【注意】:这种线是专门为树莓派(Raspberry Pi)的复合视频模式设计的,与其他电脑或设备基本不兼容。它只能传输画质普通的复合信号,红白头依然只负责声音。
  • 转码器(Transcoder):这种设备可以将高品质的 RGB 信号“降级”转换为分量、复合或 S-Video 信号,反之亦然。

    • 【提示】:转码器通常需要独立供电,但它并不等同于“主动式转换器”。它内部没有处理器来重新处理画面,只是单纯地进行信号格式的“翻译”。它的外观通常是一个不起眼的小方盒。
  • 垂直刷新率(Vertical refresh rate):这是你最熟悉的参数,单位是赫兹(Hz),代表屏幕每秒钟能画出多少张完整的画面。

    • 常识普及:现代显示器几乎全是 60 Hz。但在老式的 CRT 时代,这个标准是割裂的:根据你居住的地区不同(比如电压和电视制式差异),有些地方用 60 Hz(如美日版 NTSC),有些地方则是 50 Hz(如欧版 PAL)。
  • VGA 接口(VGA port):这就是那个拥有 15 个插孔的蓝色接口,在旧电脑和教室投影仪上随处可见。

    • 【注意】:这里需要区分“VGA 信号”和那个被称为 D-Sub 的梯形连接器。虽然它们长得一样,但并不是所有 D-Sub 接口跑的都是 VGA 信号。
    • 生活化类比:这就像是“吸管”,虽然管子长得一样,但里面流的可能是可乐(VGA 信号),也可能是果汁(RGB 信号)。只要设置得当,同一个 D-Sub 接口既能发送 RGB 信号,也能发送 VGA 信号。
  • VGA 信号(VGA signal):这是一种非常独特的数字/模拟混合信号(Digital/Analogue hybrid signal)

    • 地位:它在 80 年代末到 90 年代初成为了电脑显示器的标准,甚至成为了大多数视频设备的“行业准则”。虽然现在正逐渐退出历史舞台,但它几乎与诞生以来的所有显示设备都保持着良好的兼容性。
    • 局限性:虽然 VGA 信号本身是模拟的,但它是专为电脑监视器设计的,依赖于一些数字信号特性。这些特性在普通的家用电视机上是缺失的。
    • 【提示】:正因如此,如果没有极其专业的硬件,你无法将 VGA 信号转码(Transcode)成其他的模拟视频信号(如复合或分量信号)。这超出了本文的讨论范围,但如果你能搞定连接,依然可以参考本指南后半部分的“系统界面缩放(ES scaling)”设置。
    • 识别差异:与其他纯模拟信号不同,VGA 利用 EDID(数据标识码)来主动告知电脑它支持的分辨率。因此,它不能按照本指南中针对老式 CRT 的方式进行配置;如果你使用的是纯 VGA 信号,请使用常规的分辨率修改方法。
  • YPbPr 视频信号(YPbPr video signal):这是一种比 RGB 带宽更低的信号格式,它聪明地将绿色通道和亮度通道合并到了同一根导线中。

    • 应用场景:它通常由分量视频线(三色头)使用,但也可以通过 SCART 接口进行传输。

准备工作(Prerequisites)

想要在你的设备上实现原生模拟信号输出,你需要准备好以下“装备”:

  • 网络连接:建议使用有线网络,因为它是“即插即用”的,不需要额外配置。
  • 针对 x86_64(普通 PC)平台:
    • 核心硬件:一块具备 RGB 模拟输出能力的独立显卡或集成显卡。

显卡选型指南

你可以根据手中的显卡型号进行对号入座,看看它是否在支持名单内:

显卡阵营 建议型号与接口 备注说明
AMD / ATI (首选推荐) 拥有 VGADVI-I 接口的显卡。范围从 Radeon HD 3000 系列一直到 Radeon R5/R7/R9 300 系列。 包含 Radeon RX 300 以前的系列(不含 R9 390)。其中 R9 380X 是支持模拟输出的最强 AMD 卡。
AMD 专业卡 FirePro 系列,最高支持到 W5000 适合工作站用户。
Nvidia 拥有 VGADVI-I 接口的显卡,最高支持到 GTX 900 系列(推荐使用 GTX 980)。 【注意】Nvidia 显卡存在一些缺陷,通常被限制在“超级分辨率(Super Resolutions)”下使用。2008 年以前的老卡可能没这个限制。
Nvidia 高端/专业卡 Titan 系列(最高支持到 Titan X,但不含 Titan X Pascal);Quadro 系列(最高到 K5200)。 其中 Titan X 是支持模拟信号的性能怪兽。

【提示】如果你使用的是比 GTX 600 更老的显卡,官方驱动可能已经不再支持了。不过,如果你只是玩第五代游戏机(如 PS1、N64)及更早的模拟器,使用开源的 Nouveau 驱动性能也足够了。

特殊情况:DisplayPort 接口

  • 带有 DisplayPort 接口的 Nvidia 显卡
    • 【警告】:这类显卡本身不具备原生模拟信号。如果强行使用,需要通过特殊手段禁用驱动底层的硬限制,这具有潜在的危险性,而且还需要连接一大堆乱糟糟的转接线。

生活化类比:这就像是给一台老式留声机接音箱。AMD 的老卡自带“模拟输出口”,连上就能听;而 Nvidia 的新卡只认“数字信号”,非要接老设备的话,就得像做外科手术一样破解它的系统,还得出动一堆杂乱的转接头。

  • 如果你坚持使用这条路线,就需要准备一个主动式转换器(Active converter),或者使用特定的 CableDeconn DP 转 VGA 适配器
    • 【注意】:通常不推荐这种做法,因为它输出的并不是纯正的原生模拟信号。
    • 即使使用了转换器,你仍然可能需要一个转码器(Transcoder)
  • AMD APU(集成显卡处理器):如果你的主板自带 VGADVI-I 接口,可以尝试使用。
    • 【提示】:这完全取决于运气,受限于硬件本身的限制,通常越老旧的芯片成功的概率反而越高。
  • Intel 集成显卡:同样要求主板自带 VGADVI-I 接口。
    • 【注意】:Intel 的集显存在一些固有的缺陷和限制,同样是“越老越香”。
  • 显示设备连接方案:
    • 如果你的电视、PVM 或 BVM 监视器使用 SCARTBNC 输入:你需要准备相应的 DVI-I/VGA 转 SCART/BNC被动式适配线缆(Passive adapter/cable)
    • 如果你直接使用带 VGA 输入的电脑显示器:只需要一根标准的 VGA 线即可。
    • 如果你的电视只有分量(Component)复合(Composite)S-video 输入:你需要一个合适的 DVI-I/VGA RGB 转分量/复合/S-video转码器
    • 如果你的古董电视只有 RF(射频/天线)输入:除了转码器外,你还需要一个复合转 RF 调制器(RF modulator)
  • 软件工具准备:
    • 能够通过 SSH 远程连接(Secure Shell)访问 Batocera 系统的工具(Windows 用户推荐使用 PuTTY)。
    • 能够通过网络编辑文件的工具(Windows 用户推荐使用 WinSCPNotepad++)。

【提示】强烈建议使用 Notepad++WinSCP 这种外部编辑器,而不是命令行工具。它们不仅操作更人性化,而且能正确处理 Unix 换行符(Unix line terminators)。千万不要用 Windows 自带的记事本,它会破坏文件格式。


硬件匹配流程图

如果上述内容让你感到困惑,这里有一张精心制作的流程图,展示了不同显示器(针对 PC 平台)所需的配置路径:

(此处为原作者在画图工具里耗费大量心血绘制的硬件连接示意图)


推荐的分量转码器

如果你需要将 VGA 信号转为分量信号,以下是一些推荐的适配设备:

linuxbot3000 出品的 RGB VGA 转 YPbPr 分量转码器/转换器
* eBay 购买链接
* 官方主页

生活化类比:转码器就像是一个“翻译官”,它负责把显卡说出的 RGB “语言”准确地翻译成电视能听懂的“分量方言”。市面上的转码器质量参差不齐,选择上述推荐的设备能让你的画质更清晰、颜色更准确。

进阶利器:推荐的转码器列表

如果你需要将信号转换成显示器能识别的格式,选择一款稳定可靠的转码器(Transcoder)至关重要。以下是目前市面上口碑较好的几种选择:

分量信号转码器(RGB to Component Transcoders)

这类设备负责将 RGB 信号转换为分量信号(YPbPr),适用于带红绿蓝三色接口的电视。

  • GreenAntz RGB 转分量转码器
  • Retrotink RGB2COMP(SCART 转分量)
  • RGBS VGA/SCART 转 YPbPr 分量转码器
    • AliExpress 购买链接
    • 【注意】这款设备的接线颜色编码比较特殊,请务必按以下对应关系连接:
      • 绿色接口 -> 输出 Pb 信号
      • 红色接口 -> 输出 Y 信号
      • 蓝色接口 -> 输出 Pr 信号
  • 多功能 RGBS/SCART 转 YCBCR/YPBPR/S-Video 适配器
    • ArcadeExpress 购买链接
    • 【提示】你也可以在 AliExpress 上通过搜索关键词 “SCART RGBS to YUV YCBCR Video Converter” 找到它。

复合与 S-Video 转码器(Composite/S-Video Transcoders)

如果你的老电视只有黄色插头(复合信号)或 S-Video 接口,请关注以下设备:

  • linuxbot3000 出品的 RGB VGA 转 NTSC S-Video 及复合信号转码器
    • 可在 eBay 购买或访问其个人主页。
  • RGB 转 Composite & S-Video Ver2.0

DisplayPort 转 VGA 数模转换器(DP to VGA DAC)

生活化类比: 如果你的现代显卡只说“数字语言”(只有 DP 接口),而你的转码器只听得懂“模拟语言”,你就需要一个翻译官先做第一次转换。

如果你只有 DP 接口,请先使用 CableDeconn DP to VGA 适配器 将信号转出,再连接到上述你选择的转码器上:
* 官方网站链接
* Amazon 购买页面

【注意】虽然这种方案可行,但由于经过了多次转换,它不再属于纯粹的“原生模拟信号”,画质可能会有细微损耗。

如果你处于必须使用主动式适配器(Active adapter)的境地,CableDeconn DP 转 VGA 适配器是目前的最佳方案之一。

为什么选它?
绝大多数主动式适配器都会自带“自动隔行扫描消除(Automatic deinterlacer)”功能,这在老游戏领域简直是画质杀手。而这款适配器剑走偏锋,采用了瑞昱(Realtek)的 RTD 2166 音频芯片进行信号转换。

【提示】由于它不依赖晶体振荡器(Oscillating crystal),因此不会产生时序同步问题,更重要的是它没有那个烦人的自动去隔行功能,能最大程度保住你的原始画质。


USB-C 转 VGA 数模转换器(USB-C to VGA DAC)

如果你手中只有 USB-C 接口,建议使用 StartTech.com 的 USB Type-C 转 VGA 连接线(长度 3 米,型号为 CDP2VGA3MBNL),将其连接到你的转码器上。

【注意】线缆长度很重要! 只有这款 3 米长的版本才配备了关键的 RTD2166 芯片。该品牌同型号的其他短款线缆可能使用了不同的芯片,无法保证兼容性。

生活化类比:这就像是买同一款号的衣服,虽然外表看起来一样,但只有“3 米码”的内里才是纯棉(RTD2166 芯片)的,短码的可能就换成化纤材料了。


第一步:将 PC 连接至 CRT 显示器

在准备好上述所有硬件后,我们的第一步就是建立物理连接。请根据你的显示设备类型,参考下表选择最稳妥的连接路径:

显示器类型 所需线缆/转换器
带 VGA 口的电脑监视器 标准 VGA 线
带 SCART/BNC 口的监视器 对应的被动式适配线
普通电视机(分量/复合/S端子) 对应的转码器(Transcoder)

完成物理连接后,请确保所有接头都已拧紧或插牢,接下来我们将进入系统内部进行软件层面的精细调校。

第一步:物理连接与安全启动

要让 Batocera 电脑与 CRT 显示器“成功握手”,物理连接是第一步。

如果你使用的是带有 VGA 接口且支持 EDID 数据标识码(通常是 1994 年以后生产的)的电脑监视器,过程非常简单:连上线,先开显示器,再开电脑即可。

【注意】 对于所有其他类型的显示器(如普通电视、监视器),或者生产日期早于 1994 年、不支持 EDID 的老设备,请务必严格遵守以下安全操作步骤。


第二步:规避“危险信号”

在系统启动过程和分区扩容阶段,Batocera 会输出一种 CRT 无法处理的非标准分辨率。

生活化类比:这就像是给一个只能承受 220V 电压的电器强行接入了 1000V 的高压电。
【致命警告】 这些不受控的信号足以烧毁你的 CRT 电视

操作指南:
1. 开机初期:在按下电脑电源键后,请保持 CRT 电视处于关闭状态,或者将其切换到其他非信号输入频道(如别的 AV 通道)。
2. 进 BIOS 阶段:同样的规则也适用于 BIOS 启动阶段。在进入系统并加载正确的配置之前,绝不要让 CRT 接收信号。


第三步:解决启动安全问题的四种方案

为了从根源上解决开机瞬间的危险信号问题,我们有以下四种方案供你选择:

  • 方案一(最省钱):就像上文提到的,在进入 Batocera 系统界面前,手动保持电视关闭或处于其他频道。
  • 方案二(硬件方案):参考 gambaman 在 BYOAC 论坛上分享的杰作——终极 VGA 转 SCART 适配器(The ultimate VGA to SCART adapter)
  • 方案三(硬件方案):使用 buttersoft 基于上述方案设计的直通保护插头(Passthrough dongle)
  • 方案四(技术方案):使用 ATOM-15 工具刷写你的 AMD/ATI 显卡固件。
    • 【提示】 这是一种底层修改方法,可以让显卡在通电瞬间就强制输出 CRT 安全的信号。

第一步:初次开机与显示方案

确认一切连接稳妥且安全后,你就可以启动 Batocera 电脑了。

  • 使用双显示器调试:如果你想直接在 Batocera 机器上操作修改文件,可以暂时接上一台辅助的数字显示器(Digital display)
    • 【注意】:如果你打算在后续步骤中禁用其他接口的输出,那么一旦禁用生效,这台辅助显示器也将无法显示。
  • 使用 LCD 代替测试:如果你的液晶显示器(LCD)带 VGA 接口,并且能抗住老旧的标准信号而不罢工,你可以先用它代替 CRT 进行配置,等所有参数调优完毕后再换回 CRT。

第二步:重要提醒(配置前必读)

🚫 本指南内容已过时,不再推荐作为首选方案。
请优先参考 Batocera CRT 脚本官方 Wiki

🛠 最新方案:现在的 x86_64 版 Batocera 已经拥有了自动化 CRT 设置脚本(Automated CRT setup script)。对于绝大多数新用户,使用该脚本配置原生 CRT 输出才是最正确的姿势。

⚠️ 适用场景:只有当你需要对旧系统进行故障排查,或者自动化脚本无法工作时,才建议继续阅读下文。当前所有的新安装环境,请务必遵循 GitHub Wiki 上的脚本指令。


第三步:编辑系统配置文件

如果你确定需要手动干预,那么接下来我们需要深入系统底层进行“手术”。

动手前的准备:如何编辑 Batocera 配置文件

在 Batocera 中编辑系统文件就像是给一台正在运行的机器“更换零件”。由于系统本身为了稳定性做了很多保护,你不能直接像在 Windows 里那样随心所欲地保存。

生活化类比:这就像是在一间写着“禁止涂改”的教室里改作业。你得先获得老师的许可(通过 SSH 取得权限),然后把黑板报(系统文件)擦掉重写,最后还得把黑板锁好(保存生效)。

操作建议:
我们会在接下来的章节详细讲解具体要修改哪些文件。请确保你已经准备好了前文提到的 WinSCPNotepad++,它们能让你像编辑普通文本一样轻松搞定这些复杂的系统代码。

理解 Batocera 的“临时记忆”机制

Batocera 和普通的 Linux 系统(如 Ubuntu)不太一样。它的核心系统文件(比如 /etc//usr/ 文件夹里的内容)都存放在一个虚拟文件系统(Virtual filesystem)中。

生活化类比:Batocera 就像一个拥有“短期记忆”的机器人。每次开机,它都会把存放在硬盘里的“大脑快照(固件)”加载到内存(RAM)里。你在开机状态下修改的系统设置,默认只存在于内存中。一旦关机,这些记忆就会被“抹除”,下次开机又变回了原来的样子。

为了让修改永久生效,我们必须手动执行“保存覆盖层(Saving the filesystem overlay)”的操作。
【注意】覆盖层文件在更新 Batocera 时会被清除,且不同版本的系统之间不能通用。每次更新系统后,你都需要重新创建它们。


如何找到并编辑这些文件

Batocera 不会通过网络共享它的虚拟文件系统,你也无法在关机后把硬盘插到别的电脑上直接修改。你必须在系统运行状态下,通过以下两种方式进行编辑:

  1. 内置文件管理器(按键盘 [F1] 进入)。
  2. 命令行工具(通过 SSH 远程连接或 xterm 终端)。

例外情况:有两个地方的文件是“持久化”的,可以直接在电脑上看到:
* 启动分区(/boot/ partition):其他操作系统可以直接读取。
* 用户数据分区(/userdata/ partition):即默认的共享文件夹(Share)。


第一步:利用文件管理器编辑文件

对于普通用户来说,最简单的方法就是使用内置的文件管理器(仅限 x86/x86_64 架构)。

  1. 在系统的主选择菜单界面,按下键盘上的 [F1] 键,呼出文件管理器窗口。
  2. 在左侧边栏找到并点击 “Share” 文件夹。
  3. 点击窗口上方工具栏中的 “向上(Up)” 箭头,一直点到无法向上为止,这样你就进入了系统的根目录(Root)。

第二步:打开并修改文本

当你进入根目录后,就可以像在 Windows 里操作一样,寻找并双击你想要修改的文本文件。

  1. 找到目标文件后,双击它。
  2. 系统会自动调用一个基础的文本编辑器打开该文件。
  3. 在这里直接输入或修改代码即可。

【提示】虽然这种方式很方便,但如果要编辑更底层的内容,我们通常更推荐在后续步骤中使用 SSH 远程操作,因为那样效率更高。

这个内置的文本编辑器非常直观,甚至比 Windows 自带的记事本还要好用!你可以直接使用熟悉的快捷键:[Ctrl]+[C] 复制,[Ctrl]+[V] 粘贴,[Alt]+[F4] 关闭程序,以及 [Alt]+[Tab] 切换窗口。


方法二:通过 SSH 使用 nano 编辑器

如果你手边没有第二块显示器来操作文件管理器,通过 SSH 远程使用 nano 命令行编辑器是一个非常方便的选择。

nano 编辑器极速入门:
* 打开文件:输入 nano /路径/文件名.txt 即可。如果文件不存在,它会为你创建一个空白文档。
* 输入与粘贴:像普通编辑器一样直接打字。在 SSH 窗口中,你只需要点击鼠标右键,就可以将剪贴板里的内容粘贴进去。
* 保存与退出:所有的功能都对应 CtrlAlt 快捷键。你只需要记住两个:[Ctrl]+[S] 保存文件,[Ctrl]+[X] 退出编辑器。


方法三:使用 WinSCP 和 Notepad++

如果你更习惯图形化界面,可以参考专门的 WinSCP 教程。这种方法能让你像管理本地磁盘一样远程编辑 Batocera 的文件。


核心步骤:修改 PC 端的启动分辨率

【重要前提】
* VGA(带 EDID)用户:如果你的显示器能自动报上名号(有 EDID),可以跳过此步。
* VGA(无 EDID)用户:在设置分辨率时,请务必使用 640x480eS(注意没有中间那个 “i”),而不是 640x480ieS

如果你使用的是 CRT 电视,我们需要修改 syslinux.cfg 文件,让 Batocera 在低分辨率下启动。

第一步:进入 SSH 并获取修改权限
由于启动分区(Boot partition)默认是只读的,我们需要先给它“松绑”:
1. 通过 SSH 连接到 Batocera。
2. 输入并运行以下命令,将启动分区设为可写模式:
bash
mount -o remount,rw /boot

第二步:精准定位你的视频输出口
我们需要确认显卡模拟输出接口的确切名称。
1. 在 SSH 会话中输入以下命令:
bash
ls /sys/class/drm/

2. 查找线索:在弹出的列表中寻找你的模拟接口名称。
* 【提示】:请忽略带有 card# 字符串的部分。你需要记下的是类似 DVI-I-1VGA-1 这样的名称,这在接下来的配置中至关重要。

生活化类比:这就像是给快递员指路。你得先打开仓库大门(挂载读写),然后查清楚你的收货口到底是“一号侧门(DVI-I-1)”还是“正大门(VGA-1)”,这样信号才能准确投递到你的 CRT 电视上。

在运行完查询命令后,你会看到类似 card0 card0-DP-1 card0-DVI-I-1 renderD128 这样的一串字符。

第一步:锁定你的输出接口名称
观察输出结果,找到那个代表模拟接口的字段。
* 例子:如果看到 card0-DVI-I-1,那么你的接口名称就是 DVI-I-1。请记好它,这是后续配置的“门牌号”。

第二步:定位启动配置文件
为了让 Windows 用户操作更顺手,建议使用 WinSCP 配合 Notepad++ 来完成这一步。你需要根据系统的引导方式找到对应的 syslinux.cfg 文件:
* 传统引导(Legacy)模式:文件路径为 /boot/boot/syslinux/syslinux.cfg
* UEFI 引导模式
* Batocera v39 及更高版本:路径为 /boot/EFI/Batocera/syslinux.cfg
* Batocera v38 及更低版本:路径为 /boot/EFI/BOOT/syslinux.cfg

第三步:修改启动参数
找到文件中以 APPEND 开头的那一行,我们需要在行末添加一段指令,告诉系统:“请在启动时使用 640×480 的隔行扫描分辨率”。

  1. APPEND 行的最末尾先敲一个空格
  2. 紧接着输入 video=您的接口名称:640x480ieS(千万注意,末尾不要多留空格!)。

生活化类比:这就像是在给一份“启动清单(APPEND 行)”加备注。原本清单上写着“安静启动、关闭光标”,现在你加了一句“用 DVI-I-1 接口输出 640×480 画面”。

  • 修改示例
    • 原内容APPEND label=Batocera console=tty3 quiet loglevel=0 ... mitigations=off
    • 修改后APPEND label=Batocera console=tty3 quiet loglevel=0 ... mitigations=off video=DVI-I-1:640x480ieS

配置实例参考

如果你想了解更详尽的受支持分辨率,可以查阅 GitHub 上的官方文档。以下是一个完整的 syslinux.cfg 文件修改后的样子:

UI menu.c32

TIMEOUT 50
TOTALTIMEOUT 300

SAY Booting Batocera.Linux...

MENU CLEAR
MENU TITLE Batocera.Linux
MENU SHIFTKEY

LABEL Batocera
MENU LABEL Batocera.Linux (正常模式)
MENU DEFAULT
Linux /boot/Linux
# 注意下方 APPEND 行末尾添加的内容
APPEND label=Batocera console=tty3 quiet loglevel=0 vt.global_cursor_default=0 mitigations=off video=DVI-I-1:640x480ieS
INITRD /boot/initrd.gz

LABEL verbose
MENU LABEL Batocera.Linux (详细模式)
Linux /boot/Linux
APPEND label=Batocera vt.global_cursor_default=0
INITRD /boot/initrd.gz

【提示】修改完成后记得保存。如果你是直接通过 SSH 编辑的,别忘了之后要进行系统覆盖层的保存操作。

不用担心你的 CRT 显示器是否支持更高的分辨率,目前的设置只是为了确保万全。我们稍后会为系统界面(EmulationStation)进行精细调优,现在的首要任务是绝对不能在启动过程中发送那些可能烧毁 CRT 的危险信号。


屏蔽 PC 上的多余视频输出

为了获得最佳性能并避免后续步骤中与自动分辨率切换工具(Switchres)发生冲突,强烈建议禁用显卡上所有的纯数字输出接口(如 HDMI 或 DP 接口),仅保留模拟输出接口(如 DVI-I 或 VGA)。

生活化类比:这就像是给显卡戴上“眼罩”,封住那些通往现代液晶屏幕的“数字路口”,强迫它只能从唯一的“老式模拟路口”向外传输信号,确保心无旁骛。

请按照以下步骤重新组织你的显卡输出:

第一步:获取数字输出接口的底层名称
我们需要再次通过终端命令查看显卡的完整接口列表。这次,我们需要带上 card# 字符串的完整名称。
1. 在 SSH 会话中输入:ls /sys/class/drm/
2. 查找线索:系统会返回类似 card0-DP-1card0-DVI-I-1 等字样。
3. 确定目标:在这个例子中,我们要禁用的数字接口(DisplayPort)就是 card0-DP-1

第二步:获取接口在显示服务中的名称
我们需要用另一个工具来确认这些接口在图形服务(X Server)中的“花名”。
1. 输入命令:xrandr -display :0.0 | grep "connected"
2. 辨别结果:系统会返回类似 DisplayPort-0 disconnectedDVI-0 connected
3. 锁定名称:每行开头的第一个单词就是我们要找的接口名。例如,我们要禁用的 DP 接口可能叫 DisplayPort-0(即便它显示为未连接状态)。请记下这里显示的所有接口名称。

第三步:创建配置文件实施“封锁”
现在我们需要手动创建一个配置文件,告诉系统哪些门需要关上。
1. 进入文件夹:/etc/X11/xorg.conf.d/
2. 创建一个名为 10-monitor.conf 的新文件。
3. 在文件中填入以下内容(请根据你实际查到的接口名替换括号中的内容):

Section "Monitor"
Identifier "[这里填入你在第一步或第二步查到的接口名]"
Option "Ignore" "true"
EndSection

【提示】通过这种方式,你可以确保系统只会通过你选定的模拟接口输出信号,从而避免在调试 CRT 时出现画面偏移或信号丢失的混乱情况。

Option "Ignore" "true"
EndSection

Section "Monitor"
Identifier "[接口名称]"
Option "Ignore" "true"
EndSection

为了让你更清楚如何操作,这里有一个基于前文示例编写的 10-monitor.conf 完整示例。在这个例子中,我们成功屏蔽了显卡的 DisplayPort 接口:


Section "Monitor"
Identifier "card0-DP-1"
Option "Ignore" "true"
EndSection

Section "Monitor"
Identifier "DisplayPort-0"
Option "Ignore" "true"
EndSection

第四步:永久保存修改
还记得我们之前提到的“临时记忆”吗?为了不让配置在关机后消失,你必须运行以下命令来保存文件系统覆盖层(Filesystem overlay)

batocera-save-overlay

运行后,这些更改就会在下次启动时生效。
【注意】如果你未来更新了 Batocera 系统,这些覆盖层文件会被清除,到时候你需要重新执行本指南中的步骤。

验证结果:
你可以再次输入 xrandr -display :0.0 | grep "connected" 来检查。如果配置成功,你将只能看到你保留的那个模拟接口(如 DVI-0),那些被屏蔽的数字接口已经彻底消失在列表里了。


针对 Nvidia 900 系列显卡的特殊调教

如果你使用的是 GTX 960、970、980 或 980ti(带有 DVI-I 接口的型号),默认情况下显卡会拒绝显示超低分辨率。

生活化类比:这就像是一个自尊心极强的“高级翻译”,它觉得说这种低分辨率的“土话”太丢人,所以拒绝开口。我们需要通过配置文件强迫它放下身段。

操作步骤:
1. 在 /etc/X11/xorg.conf.d/ 目录下创建一个名为 99-nvidia.conf 的新文件。
2. 将以下代码粘贴进去,这将解除显卡对低频、非 60Hz 及隔行扫描模式的限制:


Section "Device"
Identifier "Card0"
Driver "nvidia"
Option "ModeValidation" "AllowNon60HzDFPModes,NoMaxPclkCheck,NoEdidMaxPClkCheck,AllowInterlacedModes,NoMaxSizeCheck,NoHorizSyncCheck,NoVertRefreshCheck,NoEdidDFPMaxSizeCheck"
EndSection

  1. 修改完成后,别忘了再次运行 batocera-save-overlay 保存。

将 640x480i 设为 PC 端的默认分辨率

完成上述底层屏蔽后,我们就可以正式让 Batocera 的图形界面以最适合 CRT 电视的 640x480i(隔行扫描模式) 运行了。这能保证你的菜单文字在老电视上清晰可读,且画面比例正确。


如果你使用的是 **VGA 信号显示器**,它可能不支持**隔行扫描信号(Interlaced signal)**。你可以通过分辨率末尾是否有字母 “i” 以及时间参数(Timings)中是否有 “interlace” 选项来判断。

【提示】对于自带 **EDID 数据标识码**的 VGA 显示器,系统通常能自动识别,这一步并非必须。

如果你手头有一台 1987 年至 1993 年间生产、且没有 EDID 的老式 **IBM 显示器**,可以参考下表查看它们支持的最大**逐行扫描(Progressive)**分辨率:

### IBM 经典显示器参数表 (1987-1993)

| 型号 | 出厂年月 | 标准 | 物理尺寸 | 可视面积 | 分辨率 | 点距 (mm) | 备注 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| 8512 | 1987年4月 | VGA | 14" | 11.8" | 640x480 | 0.41 | |
| 8513 | 1987年4月 | VGA | 12" | 10.4" | 640x480 | 0.28 | |
| 8514 | 1987年4月 | XGA | 16" | 14.4" | 1024x768 | 0.31 | |
| 8515 | 1991年9月 | XGA | 14" | 12.3" | 640x480 | 0.28 | |
| 8511 | 1992年3月 | VGA | 14" | 11.8" | 640x480 | 0.39 | |
| 6312 | 1992年9月 | SVGA | 14" | 11.7" | 1024x768 | 0.28 | |
| 6314 | 1992年9月 | SVGA | 14" | 12" | 1024x768 | 0.28 | |
| 6319 | 1992年9月 | SVGA | 15" | 12.6" | 1024x768 | 0.28 | |
| 9515 | 1992年9月 | XGA | 14" | 12.3" | 1024x768 | 0.28 | |
| 9518 | 1992年9月 | VGA | 14" | 12.3" | 640x480 | 0.28 | |
| 9517 | 1992年11月 | XGA | 17" | 14.7" | 1280x768 | 0.26 (stripe) | 特步龙 (Trinitron) |
| 6317 | 1993年4月 | SVGA | 17" | 14.7" | 1280x1024 | 0.28 | |
| 6318 | 1993年4月 | SVGA | 14" | 12.1" | 800x600 | 0.39 | 低端型号 |

> 数据源自《IBM 显示器个人系统参考手册 (1987-2005)》第 2 页。

---

### 设置默认分辨率的操作流程

现在我们要正式告诉 Batocera 应该以什么样的分辨率作为“主菜单”界面。

**第一步:获取显示器的系统级 ID**
我们需要精准锁定当前连接的显示器标识符。
1. 在终端输入以下命令:
   `xrandr -display :0.0 | grep "connected"`
2. **观察输出**:你会得到一段类似之前查过的返回内容。

**生活化类比**:这就像是在点名。虽然你已经把线插好了,但我们得确认系统给这台 CRT 显示器贴上的“工号”到底是什么(比如 `DVI-0` 或 `VGA-0`),这样接下来的指令才不会发错人。

是不是觉得这个输出结果很眼熟?没错,记下那个处于 “connected” 状态的接口名称,我们马上就要用到它。

### 设定主菜单的默认分辨率

现在我们要正式确立 CRT 显示器的“工作语言”。

**第一步:确定接口名称与显示参数**
首先,确认你打算使用的接口名称(例如在上一步中查到的 `DVI-0`)。
接着,你需要找到适合你显示器的**显示模式参数(Modeline)**。
* **【提示】**:你可以通过搜索显示器的型号加“规格(Specifications)”来查找。
* **万能方案**:如果你实在查不到,可以使用下面提供的 **640x480i** 参数,它几乎能被所有的 CRT 显示设备接受。

**第二步:修改启动配置文件**
我们需要修改系统的 `xinitrc` 文件,让它在启动界面(EmulationStation)时默认进入低分辨率模式。

1.  打开文件 `/etc/X11/xinit/xinitrc`。
    * **【注意】**:在动笔之前,强烈建议先给这个文件做一个**备份**,以防万一。
2.  在文件中找到 `openbox --config-file ... "EmulationStation-standalone"` 这一行。
3.  在该行之前的空白处插入一个新的空行,并粘贴对应的代码。

**第三步:插入强制分辨率指令**
这段指令会强制 Batocera 的所有程序都在这个全屏分辨率下运行。

* **方案 A:针对普通 CRT 电视(使用 DVI-0 接口示例):**
    将以下内容粘贴进去:

    ```bash
    ########################
    #####-CRT 配置-#######
    ########################
    ##-默认分辨率-##
    ########################
    xrandr -display :0.0 --newmode "640x480i" 13.10 640 664 728 832 480 484 490 525 interlace -hsync -vsync
    xrandr -display :0.0 --addmode DVI-0 "640x480i"
    xrandr -display :0.0 --output DVI-0 --mode "640x480i"
    ########################
    ########################
    ```

* **方案 B:针对没有 EDID 的老式 VGA 监视器(使用 VGA-0 接口示例):**
    如果你用的是老电脑显示器,请改用这段代码:

    ```bash
    ########################
    #####-CRT 配置-#######
    ########################
    ##-默认分辨率-##
    ########################
    xrandr -display :0.0 --newmode "640x480_60 30.120000KHz 60.000000Hz" 24.577920 640 694 701 816 480 482 483 502 -hsync -vsync
    xrandr -display :0.0 --addmode VGA-0 "640x480"
    xrandr -display :0.0 --output VGA-0 --mode "640x480"
    ########################
    ########################
    ```

**生活化类比**:这就好比你给一位只会读大字报的老教授(CRT)送报纸(视频信号)。原本你送的是排版细密的现代杂志(高分辨率),老教授看不清。现在你在他开门前(系统启动前),先在大门口立个牌子(xrandr 指令),规定以后所有的报纸必须印成大号字体(640x480i),这样他就能舒舒服服地阅读了。

如果之前的设置对于你那台没有 EDID 的 VGA 监视器不起作用,你还可以尝试切换到 **800x600** 分辨率:

```bash
########################
#####-CRT 配置-#######
########################
##-默认分辨率-##
########################
xrandr -display :0.0 --newmode "800x600_60 37.620000KHz 60.000000Hz" 41.193900 800 891 902 1095 600 602 603 627 -hsync -vsync
xrandr -display :0.0 --addmode VGA-0 "800x600"
xrandr -display :0.0 --output VGA-0 --mode "800x600"
########################
########################

第一步:保存并使设置永久生效

修改完文件后,我们需要把这些“短期记忆”变成硬盘里的“长期记忆”。

  1. 保存 xinitrc 文件并关闭编辑器。
  2. 在终端输入以下命令保存覆盖层:
    bash
    batocera-save-overlay
  3. 输入 reboot 重启系统。

此时,系统应该会以 640x480i 模式(如果你用的是无 EDID 的 VGA 方案,则是 480p 模式)启动。


第二步:在系统菜单中锁定输出

重启进入界面后,我们还需要在图形设置里做最后的确认。

  1. 进入 主菜单(MAIN MENU) -> 系统设置(SYSTEM SETTINGS)
  2. 找到 视频输出(VIDEO OUTPUT) 选项。
  3. 将其手动设置为你打算使用的端口(例如 “DVI-0” 或 “VGA”)。
  4. 最后再重启一次机器。

参考示例:修改后的 xinitrc 文件

为了防止你贴错位置,这里提供了一个添加了 CRT 参数后的 /etc/X11/xinit/xinitrc 文件范例。你可以参考代码中的结构:

#!/bin/sh

# 隐藏鼠标指针
unclutter --noevents -b

# 禁用电源管理,防止屏幕变黑
xset -dpms
xset s off

# 允许 EmulationStation 生成核心转储文件
ulimit -H -c unlimited
ulimit -S -c unlimited EmulationStation

# 启动 dbus,这是访问回收站等功能所必需的
eval `dbus-launch --sh-syntax --exit-with-session`

### Intel Iris 驱动设置 ###
irisdriver="$(/usr/bin/Batocera-settings-get -f "$BOOTCONF" intel-i965-driver)"
if test ! -z "${irisdriver}" -a "${irisdriver}" = true; then
# 通过环境变量强制使用 i965 驱动
export MESA_LOADER_DRIVER_OVERRIDE=i965
fi
###################

### Nvidia 驱动设置 ###
# 用于处理 Intel/Nvidia 双显卡切换的变量
nvidia_driver="$(/usr/bin/Batocera-settings-get -f /boot/Batocera-boot.conf nvidia-driver)"

# (此处接上文插入的 CRT 配置代码)

【提示】如果你在重启后发现屏幕依然闪烁或者黑屏,请重新检查 xrandr 命令中的接口名称(Identifier)是否与你之前查到的一致。

接续上文的配置示例,我们将继续优化系统环境,并解决一个影响画面平滑度的关键问题。

以下是完整的 xinitrc 文件配置参考(接驱动部分):

if test "${nvidia_driver}" = "true"
then
    nvidia_prime="$(/usr/bin/Batocera-settings-get -f /boot/Batocera-boot.conf nvidia-prime)"
    if test "${nvidia_prime}" = "true"
    then
        export __NV_PRIME_RENDER_OFFLOAD=1
        export __VK_LAYER_NV_optimus=NVIDIA_only
        export __GLX_VENDOR_LIBRARY_NAME=nvidia
    fi
fi

### Radeon 显卡设置 ###
# 针对 AMD 动态切换显卡,在双显卡笔记本中强制使用独立显卡
radeon_prime="$(/usr/bin/Batocera-settings-get -f /boot/Batocera-boot.conf radeon-prime)"
if test "${radeon_prime}" = "true"
then
    export DRI_PRIME=1
fi

########################
#####-CRT 配置-#######
########################
##-默认分辨率设置-##
########################
# 定义 640x480i 模式
xrandr -display :0.0 --newmode "640x480i" 13.10 640 664 728 832 480 484 490 525 interlace -hsync -vsync
# 将此模式添加到指定的 DVI-0 接口
xrandr -display :0.0 --addmode DVI-0 "640x480i"
# 强制让该接口以此模式输出
xrandr -display :0.0 --output DVI-0 --mode "640x480i"
########################
########################

# 启动图形界面窗口管理器及 EmulationStation
openbox --config-file /etc/openbox/rc.xml --startup "EmulationStation-standalone"

防止系统界面强制 60Hz 刷新

在默认情况下,系统前端界面(EmulationStation,简称 ES) 会时刻尝试强行锁定在 60Hz 的刷新率。

对于老游戏玩家来说,这可能会带来一系列连锁反应:
* 画面掉帧感(Frame pacing):滚动画面看起来不连贯、一卡一卡的。
* 音频杂音:声音可能会出现爆音或裂音(Crackling)。
* 游戏逻辑混乱:直接影响游戏节奏、物理引擎和计时系统。

生活化类比:这就像是一个自作聪明的“节拍器”。无论乐曲原本是什么节奏,它都强行按每秒 60 下来打拍子。如果乐曲本身是每秒 50 下(比如 PAL 制式游戏),节奏就会彻底乱套,听起来和看起来都会非常别扭。

为了解决这个问题,我们需要通过“注释(Commenting out)”掉部分代码,来解除 ES 强制锁定 60Hz 的限制。


第一步:备份原始脚本

在进行任何修改之前,务必先给“后悔药”准备好。我们要在 SSH 远程连接 终端中运行备份命令。

  1. 连接到你的 Batocera。
  2. 输入并运行以下命令,为原启动脚本创建副本:
cp /usr/bin/EmulationStation-standalone /usr/bin/EmulationStation-standalone.bak

【提示】这样即使你改错了,也可以随时用 .bak 文件恢复回去,避免系统无法正常进入界面。

第二步:修改启动脚本解除锁定

备份完成后,我们需要对脚本进行“手术”,让系统界面不再死磕 60Hz。

  1. 打开文件 /usr/bin/EmulationStation-standalone
  2. 找到 # try to force 60hz (specific to xorg) 这一行。
  3. 开始注释:在这行下方的三行代码开头分别加上 # 号,把它们变成“无效说明”。

修改后的代码块看起来应该是这样的:

# try to force 60hz (specific to xorg)
# FRAMERATE="$(/usr/bin/Batocera-settings-get es.framerate)"
# test -z "${FRAMERATE}" && FRAMERATE=60
# which xrandr && xrandr -r "${FRAMERATE}"
###################
  1. 保存并退出编辑器。
  2. 永久保存:在终端输入 batocera-save-overlay 确保修改不会丢失。
  3. 输入 reboot 重启系统。

解决系统界面的显示偏移与黑边问题

重启后你可能会发现,系统菜单的边缘被切掉了,或者画面没有居中。

生活化类比:这就像是给窗户贴窗花(画面),由于每台老式 CRT 电视的“窗框”(显示区域)大小和位置略有差异,窗花可能会贴歪,或者一部分被折到了窗框后面。这种现象我们称为过扫描(Overscan)

【提示】如果你运气极好,画面正好完美居中,可以跳过此步。但绝大多数用户都需要手动微调。在操作时,请确保你能直接盯着 CRT 屏幕看。

另一种方案:你可以直接下载一个专为 CRT 优化的主题,这类主题会把所有元素向内收缩以避开边缘。同时关闭模拟器中的“裁剪过扫描(Crop overscan)”选项,这样能获得更原汁原味的游戏体验。


第一步:设置偏移量(画面对齐)

我们的目标是先把画面的左上角与屏幕的左上角对齐。这是为后续调整画面比例打好基础。

我们将使用以下参数指令:
--screenoffset [x] [y]:将整个画面向右移动 [x] 像素,并向下移动 [y] 像素。

操作步骤:
1. 打开文件 userdata/system/batocera.conf
2. 滑动到文件末尾,添加以下代码:

## ES 设置
es.customsargs=--screenoffset 00 00

先将其设为 00 00,接下来我们将根据实际观察到的画面位置,通过修改这两个数字来“平移”画面,直到左上角完美对齐。

第二步:实机调试画面位移

当你修改完配置文件后,需要通过以下步骤查看效果:

  1. 保存文件
  2. 重启界面:在 SSH 终端中输入以下命令,让 EmulationStation 立即刷新:
    bash
    batocera-es-swissknife --restart
  3. 反复微调:观察 CRT 屏幕。不断增大或减小 --screenoffset 后的两个数字,直到画面的左上角像素点精准地落在你想要的位置。

第三步:调整画面缩放(Scaling)

缩放功能决定了图像在屏幕上的实际占用空间。

生活化类比:老式 CRT 电视对像素的对齐并不严谨,有点像是在软软的画布上画画。即使你物理对齐得再好,像素点之间也可能互相“晕染”模糊。这部分的调整就像是拉伸或收缩这块画布,确保画面内容不会溢出边框。

我们将使用以下参数:
--screensize [宽度] [高度]:以左上角为锚点调整画面大小。增加数值会向右、向下伸展图像;减小数值则会把图像从右侧和底部向内“挤压”。

操作指南:

  1. 设定初始值:我们先从你的启动分辨率开始尝试。在这个案例中,初始值是 640 480
  2. 修改配置文件:再次打开 userdata/system/batocera.conf,找到刚才那行 es.customsargs
  3. 添加缩放参数:在 --screenoffset 之前添加 --screensize 640 480(注意两个参数之间要有一个空格)。

    修改前的样子
    “`text

    ES Settings

    es.customsargs=–screenoffset 00 00
    “`

    初步修改后的样子
    “`text

    ES Settings

    es.customsargs=–screensize 640 480 –screenoffset 00 00
    “`

  4. 最终调优示例:经过多次反复试验,你的最终参数可能会像下面这样(每个人的显示器数值都不尽相同):
    text
    ## ES Settings
    es.customsargs=--screensize 640 488 --screenoffset 38 16

  5. 查看最终效果:每改动一次数值,记得保存文件并在终端运行以下命令来“重置”界面:
    bash
    batocera-es-swissknife --restart

【提示】这是一个耐心活。建议先调好偏移(Offset)对准左上角,再调缩放(Size)去填充右侧和底部的边缘,直到整个系统菜单完美契合你的屏幕。

不断微调这些数值,直到画面的右下角像素点也完美对齐到你想要的位置。你可以参考下方的对比图来查看调整前后的效果。

画面校准前后的效果对比

^ 对齐前 ^ 对齐后 ^
| {{ hardware:es_before_centering.jpg?direct | }} | {{ hardware:es_centered1.jpg?direct | }} |


让画面缩放设置在退出游戏后依然生效

你可能会发现一个令人头疼的问题:一旦你退出模拟器回到菜单,刚才辛苦调好的画面偏移和缩放就会“被打回原形”。

生活化类比:这就像是你给电视调好了频道和亮度,但每次看完碟片关掉影碟机,电视就会自动重置成出厂设置。我们需要写一个“便签”贴在系统门口,提醒它在每次游戏结束时都记得重新加载你的配置。

按照以下步骤创建一个自动化脚本:

第一步:创建脚本文件夹
1. 在 /userdata/system/ 路径下创建一个名为 scripts 的文件夹。
2. 在该文件夹内新建一个名为 first_script.sh 的文件。

第二步:编写并保存脚本代码
将以下代码复制进去,并把 [your video port] 替换为你之前查到的实际端口名(例如 DVI-0):

#!/bin/bash

# 当检测到“gameStop(游戏停止)”信号时执行
case $1 in
gameStop)
    # 强制将输出模式重置为 640x480i,从而触发系统重新加载我们设定的画面偏移参数
    xrandr -display :0.0 --output [your video port] --mode "640x480i"
;;
esac

第三步:赋予脚本执行权限
在 SSH 终端中输入以下命令,让系统允许运行这个脚本:

chmod +x /userdata/system/scripts/first_script.sh

参考示例(以 DVI 接口为例)

如果你使用的是 DVI 接口,完整的脚本内容如下:

#!/bin/bash
# 这将强制 ES 刷新显示,从而抓取我们设置好的自定义参数(Custom Arguments)。

# 当第一个参数为 gameStop 时执行分支操作
case $1 in
gameStop)
    # 强制 DVI-0 端口进入 640x480i 模式
    xrandr -display :0.0 --output DVI-0 --mode "640x480i"
;;
esac

最后一步:永久保存
别忘了运行 batocera-save-overlay 并重启系统。

【提示】大功告成!现在当你退出模拟器时,EmulationStation 再也不会“忘掉”你精心调校的画面位置和缩放比例了。

为模拟器添加更多分辨率模式(Modelines)

到目前为止,我们只配置了一个可用的显示模式,即 640x480i。但如果你想在 PS2、PSP、GameCube、Wii 或 Wine (PC) 等模拟器中获得更完美的体验,我们需要添加更多的显示模式参数(Modelines)

为了实现这一目标,我们将借助由 Calamity 开发的 Switchres 程序。从 v30 版本开始,Batocera 已经内置了这款神器。

生活化类比:现在的 CRT 就像一个只会说一种方言(640x480i)的导游。Switchres 的作用是给导游发一本“方言手册”,让他学会根据不同的游客(不同的游戏机模拟器),自动切换到最地道的家乡话(原生分辨率)。

虽然通常建议使用 Switchres,但对于追求“全自动”和“方便移植”的玩家,还有一种进阶玩法:直接在显卡配置文件中手动定义分辨率。这样,这些分辨率就会直接出现在系统的设置菜单里,供你自由选择。


第一步:手动定义显示模式(针对 Nvidia 显卡)

如果你希望在菜单中直接看到并选择这些分辨率,我们需要修改显卡的配置文件。

  1. /userdata/system/ 目录下创建一个名为 99-nvidia.conf 的文件。
  2. 将以下代码完整复制进去。这段代码不仅定义了各种常用的 CRT 分辨率,还禁用了一些干扰项:

针对 15Khz 监视器的配置

Section “Monitor”
Identifier “Disabled”
Option “ignore” “true”

EndSection

Section “Monitor”
Identifier “CRT”
VendorName “Batocera”

Option “Enable” “true”
Option “DPMS” “False”
Option “DefaultModes” “False”

以下是为不同机种准备的特殊分辨率参数

Modeline “3600×480” 73.413510 3600 3747 4092 4679 480 483 489 523 interlace -hsync -vsync
Modeline “1920×240” 37.778 1920 1977 2154 2376 240 243 245 265 -hsync -vsync
Modeline “1920×256” 39.015450 1920 1998 2181 2493 256 276 279 313 -hsync -vsync
Modeline “1920×480” 73.413510 3600 3747 4092 4679 480 483 489 523 interlace -hsync -vsync
Modeline “2560×256” 52.42 2560 2664 2912 3328 256 257 260 276 -hsync -vsync
Modeline “2560×448” 52.22 2560 2664 2912 3328 448 467 473 523 interlace -hsync -vsync


第二步:保存设置

【提示】修改完成后,请务必执行以下两步,否则重启后配置会消失:
1. 在 SSH 终端输入 batocera-save-overlay
2. 重启你的 Batocera 机器。

通过这种方式,你手动添加的这些“超级分辨率”就会被系统识别,并在后续的模拟器设置中派上用场。

接续上文,我们继续在 99-nvidia.conf 配置文件中添加更多的显示模式参数(Modelines)。

这些参数涵盖了从超宽分辨率到经典的 PAL 制式分辨率,能让你的模拟器精准匹配各种复古主机的显示特性。

Modeline "1280x480_60,0Hz 15,7KHz (60Hz)" 26.181840 1280 1362 1429 1639 480 490 496 533 -hsync -vsync interlace
Modeline "1024x600_50,0Hz 16,0KHz (50Hz)" 20.161 1024 1032 1127 1264 600 601 607 638 interlace -hsync -vsync
Modeline "768x576" 15.627975 768 799 872 997 576 583 589 627 interlace  -hsync -vsync
Modeline "854x480" 17.415900 854 889 971 1110 480 483 489 523 interlace  -hsync -vsync
Modeline "864x486" 17.802060 864 900 984 1126 486 488 494 527 interlace  -hsync -vsync
Modeline "800x600_50,0Hz 16,0KHz (60Hz)" 15.823 800 808 883 992 600 601 607 638 interlace -hsync -vsync
Modeline "720x480_60,0Hz 15,7KHz (60Hz)" 13.959 720 728 794 888 480 483 489 524 interlace -hsync -vsync
Modeline "640x480_60,0Hz 15,7KHz (60Hz)" 12.324 640 648 706 784 480 483 489 524 interlace -hsync -vsync

# 如果需要 240p 模式,可以取消下面这一行的注释
#Modeline "320x240" 6.514560 320 333 364 416 240 242 245 261   -hsync -vsync

EndSection

配置显卡设备参数(Device Section)

在定义完“显示器能干什么”之后,我们得告诉“显卡(GPU)该怎么做”。这就需要设置 Section "Device" 部分。

生活化类比:如果说之前的显示模式是给显示器准备的“菜单”,那么现在的设备配置就是给显卡下的“指令”。我们要关掉显卡那些自作聪明的“画质增强”功能(比如自动检测刷新率),强迫它老老实实按照我们给的菜单来干活。

操作步骤:

在刚才的 99-nvidia.conf 文件中,紧接着 EndSection 之后,粘贴以下内容:

Section "Device"
Identifier  "GRPX"
Option "RenderAccel"   "1"
# 下面这一行极为重要:它禁用了显卡对垂直刷新率、水平同步、最大分辨率等各项参数的自动校验。
# 只有关掉这些“安检”,显卡才允许输出我们自定义的、不符合现代显示标准的 CRT 信号。
Option "ModeValidation" "NoVertRefreshCheck, NoHorizSyncCheck, NoMaxSizeCheck, NoMaxPClkCheck , NoVesaModes,NoXServerModes,NoEDIDModes, NoPredefinedModes ,NoExtendedGpuCapabilitiesCheck , AllowDpInterlaced,AllowNonEdidModes,NoDisplayPortBandwidthCheck ,NoEdidDFPMaxSizeCheck,NoDualLinkDVICheck"
Option "UseEDID" "False"
Option "NoEDIDModes" "true"

# 将所有可能的物理输出端口指向我们刚刚定义的 "CRT" 监视器配置
Option "monitor-DVI-0" "CRT"
Option "monitor-DVI-1" "CRT"
Option "monitor-VGA-0" "CRT"
Option "monitor-VGA-1" "CRT"
Option "monitor-HDMI-0" "CRT"
Option "monitor-HDMI-1" "CRT"
Option "monitor-HDMI-2" "CRT"
Option "monitor-DP-0" "CRT"
Option "monitor-DP-1" "CRT"
Option "monitor-DP-2" "CRT"

# 禁用 S-Video 等老式 DIN 接口,防止冲突
Option "monitor-DIN" "Disabled"
Option "monitor-DIN-0" "Disabled"
Option "monitor-DIN-1" "Disabled"

【注意】这一步完成后,你的显卡将不再理会显示器通过 EDID 数据标识码发出的任何建议,而是完全听命于你手动输入的参数。请确保你之前录入的分辨率参数与你的显示器物理性能相匹配,否则可能会导致显示器黑屏或受损。

# 如果你需要彻底禁用某些接口,可以取消下面几行的注释
#Option "monitor-HDMI-0" "Disabled"
#Option "monitor-HDMI-1" "Disabled"
#Option "monitor-HDMI-2" "Disabled"

EndSection

Section "Screen"
Identifier     "Screen0"
Device         "GRPX"
Monitor        "CRT"
Option         "AllowIndirectGLXProtocol" "off"
Option         "TripleBuffer" "on"
EndSection

Section "ServerFlags"
# 以下设置确保屏幕永远不会自动关闭或进入休眠模式
Option "blank time" "0"
Option "standby time" "0"
Option "suspend time" "0"
Option "off time" "0"
Option "dpms" "false"
Option "Xinerama" "0"
Option "AllowEmptyInitialConfiguration" "true"
EndSection

如果你采用了上述手动定义分辨率的方法,可以直接跳到后续章节。如果你更倾向于让系统自动处理,请继续阅读。

编写 Switchres 配置文件(switchres.ini)

Switchres 就像是一个智能的分辨率调度员,一旦它在 /etc/ 目录下发现了名为 switchres.ini 且权限正确的文件,它就会立刻开始工作。

生活化类比:这就像是给你的电脑请了一个“全职管家”。这个管家需要一份“工作守则”(也就是 switchres.ini),只要守则放在指定的抽屉里(/etc/ 目录),管家一看到就会按照要求,在你启动不同游戏时自动帮你调好电视的分辨率。

【提示】由于 Batocera 的系统目录结构比较特殊,你必须在系统运行状态下完成文件的移动,并执行保存覆盖层(Batocera-save-overlay)的操作,否则重启后文件就会消失。

你可以从 Switchres 的 GitHub 页面下载这个文件,通过网络共享传给 Batocera,然后按 [F1] 进入文件管理器将其移动到 /etc/ 目录。


使用 SSH 远程创建 switchres.ini

如果你不方便使用文件管理器,完全可以通过 SSH 远程连接来手动创建。

第一步:创建并打开文件
我们将使用 nano 编辑器在指定位置创建一个空白文件。输入并运行:

nano /etc/switchres.ini

第二步:填入配置内容
此时你会看到一个空白窗口。请将下方提供的配置内容完整复制,然后在 SSH 窗口中点击鼠标右键进行粘贴。

点击展开查看 switchres.ini 推荐配置内容:

#
# Switchres 配置文件
#

# 监视器预设(Monitor preset):设置监视器的典型运行范围
# 

(下接具体的监视器预设参数设置…)

switchres.ini 文件的配置中,最关键的任务是告诉系统你正在使用哪种“级别”的显示器。

配置监视器预设(Monitor Preset)

你可以根据自己的设备类型,在配置文件中选择对应的预设值。以下是常见的设备选项对照表:

预设名称 适用设备类型
generic_15 / ntsc / pal 通用 CRT 电视标准(最常用)
arcade_15 / arcade_15ex 街机固定频率监视器
arcade_15_25 / 15_25_31 街机多频同步监视器(Multisync)
vesa_480 / 600 / 1024 标准 VESA 电脑显示器
pc_31_120 / pc_70_120 120Hz 高刷 PC 监视器
k7000 / d9200 / ms2930… 各品牌街机管子(Wells Gardner, Nanao 等)

生活化类比:这就像是在给你的音响系统选“调音风格”。如果你接的是老电视,就选 ntscpal;如果你接的是专业的街机框体,就得选对应的品牌型号。


第一步:设置监视器类型

在配置文件中找到 monitor 这一行,并将其修改为你的设备类型。

# 在这里填入你的设备类型,普通 15Khz 街机监视器或电视通常设为 arcade_15
monitor                   arcade_15

第二步:定义显示范围(CRT Range)

这是进阶玩家用来微调显示器扫描频率、同步脉冲等极细微参数的地方。

【提示】 对于绝大多数用户,保持 auto(自动)即可。Switchres 会根据你在上一步选定的“预设”自动推算这些复杂的电学参数。

# 除非你是硬件专家,否则建议将这些参数全部设为 auto
crt_range0                auto
crt_range1                auto
crt_range2                auto
crt_range3                auto
crt_range4                auto
crt_range5                auto
crt_range6                auto
crt_range7                auto
crt_range8                auto
crt_range9                auto

第三步:针对 LCD 的刷新率设置(可选)

如果你是在 LCD 液晶屏上模拟老显示器的效果,可以设置刷新率范围(例如 50-61Hz)。

# 设置 LCD 监视器的运行刷新率范围,默认为自动
lcd_range                 auto

【注意】 所有的修改完成后,请记得在 nano 编辑器中按 [Ctrl]+[S] 保存,再按 [Ctrl]+[X] 退出,并随后运行 batocera-save-overlay 来确保这些设置被永久记住。

在完成了监视器类型的基础设置后,我们接着来配置 switchres.ini 中关于显示和信号生成的进阶参数。

配置自定义显示模式

这一部分允许你跳过自动设置,强制指定某种特定的显示规格。

  • 强制自定义模式(Modeline)
    你可以输入 XFree86 格式的自定义代码。
    ini
    # 默认设为 auto(自动)。如果开启,它将覆盖之前选定的监视器预设。
    modeline auto
  • 强制用户模式(User Mode)
    格式为“宽度 x 高度 @ 刷新率”。你可以使用 0 作为通配符。
    生活化类比:这就像是给管家下了一个“死命令”。比如设置 0x240,那么不管游戏原本是什么宽度,管家都会强行把画面高度固定在 240 行,确保画面能对齐 CRT 的扫描线。
    ini
    user_mode auto

第一步:锁定显示输出设备(Display Config)

你需要告诉 Switchres,要把信号发送到哪一个接口。

  1. 选择目标显示器
    ini
    # 默认为 auto(自动)。如果你有多个屏幕,可以填入 X11 的接口名(如 VGA-0)。
    display auto
  2. 选择视频后端(API)
    这是系统处理图像的底层驱动接口。
    ini
    # Linux 系统建议保持 auto 或设为 xrandr。
    api auto

第二步:配置模式锁定与刷新率

这一部分决定了系统如何处理那些“不标准”的显示请求。

  • 锁定不支持的模式(Lock unsupported modes)
    【注意】在 Windows 环境下,此项通常设为 1,用于屏蔽显示器 EDID 声明不支持的模式。
  • 锁定系统模式(Lock system modes)
    是否只使用带有详细时间参数的官方模式,建议保持 0
  • 忽略系统刷新率(Refresh dont care)
    如果设为 1,系统将不再检查显示器是否能抗住该刷新率。【提示】 为了硬件安全,建议保持 0
  • 退出时保持更改(Keep changes)
    设为 1 则退出游戏后不恢复分辨率。【警告】 这会导致退出游戏后桌面分辨率乱掉,通常保持 0

第三步:动态信号生成(Modeline generation)

这是 Switchres 的核心黑科技,它能根据游戏的实际需求“现场创作”出最合适的信号。

生活化类比:这就像是一个“随叫随到”的裁缝。只要游戏(客人)提出了身材数据,裁缝就会当场剪裁出一件完美贴合的衣服(显示信号),而不是让你去那一堆不合适的成衣(预设分辨率)里挑。

  • 开启动态生成
    ini
    # 设为 1 开启。这是实现“原生分辨率”完美显示的灵魂。
    modeline_generation 1
  • 允许隔行扫描(Interlace)
    ini
    # 设为 1 开启。对于显示 480i 这种高分辨率画面至关重要。
    interlace 1
  • 允许双倍扫描(Doublescan)模式
    【注意】大多数驱动程序对双倍扫描的支持都是坏的,请谨慎开启。

汇总参数表

参数名 默认值 说明
display auto 信号输出的接口,如 VGA-0
api auto 图像传输协议,Linux 常用 xrandr
modeline_generation 1 允许系统自动计算并生成分辨率
interlace 1 允许使用隔行扫描信号

接续上文,我们继续完善 switchres.ini 配置文件中关于像素精度、画面比例以及后端的高级设置。


进阶信号调整

这部分参数决定了图像在 CRT 屏幕上的微观表现,比如同步精度和画面比例。

  • 双倍扫描(Doublescan)
    ini
    # 默认设为 0。
    doublescan 0
  • 最小点时钟(Dotclock Min)
    设置一个强制的最小像素时钟频率(单位为 MHz)。
    生活化类比:这就像是给水龙头设一个“最小水流限制”。有些旧显卡在水流太细(频率太低)时会罢工,设置一个最小值(如 25.0)可以保证信号稳定传输。
    ini
    dotclock_min 0
  • 同步刷新容差(Sync Refresh Tolerance)
    允许游戏刷新率与显示器刷新率之间存在微小差异(单位为 Hz)。
    ini
    # 如果差异在这个数值内,系统会尝试强制同步而不扣减性能分。
    sync_refresh_tolerance 2.0
  • 超分辨率宽度(Super Resolution Width)
    这是 CRT 玩家常用的黑科技。当宽度超过这个值时,系统会在水平轴上应用无损的比例缩放。
    ini
    # 常用建议值为 2560。
    super_width 2560
  • 屏幕纵横比(Aspect Ratio)
    设置目标显示器的物理比例。
    ini
    # 如果你的屏幕不是标准的 4:3,请在此修改以补偿比例。
    aspect 4:3

画面位置与精度优化

  • 垂直偏移修正(V-shift Correct)
    【注意】这是一个实验性功能,旨在尝试修正普通民用电视画面不居中的问题。
    ini
    v_shift_correct 0
  • 像素级精度(Pixel Precision)
    第一步:启用该项。它会以 1 像素为单位计算水平边框,而不是老旧驱动所要求的 8 像素块。
    第二步:观察画面。这能极大地改善视频模式在水平方向上的居中表现。
    ini
    pixel_precision 1
  • 强制偶数行(Interlace Force Even)
    【提示】在 Linux 系统上使用 AMD 的核显(APU)硬件时,必须开启此项,将隔行扫描模式的所有垂直数值计算为偶数。
    ini
    interlace_force_even 0

视频后端高级配置

这部分主要针对多显示器环境和特定的显示故障进行优化。

  • 屏幕合成调整(Screen Compositing)

    【X11 环境】在设置新视频模式后调整显示器位置,维持多屏环境下的相对位置。
    ini
    screen_compositing 0

    * 屏幕重排序(Screen Reordering)
    【X11 环境】启动时将屏幕垂直排列,允许每个屏幕自由调整至最大宽度。
    生活化类比:这就像是把原本挤在一起的显示器“重新排队”,给每个屏幕留出足够的伸展空间,防止在使用超分辨率(Super-resolutions)时出现画面闪烁或撕裂。
    “`ini

    开启此项后会覆盖上面的“屏幕合成调整”。

    screen_reordering 0
    “`


Windows 环境下的动态模式(实验性)

【提示】在 Windows 下,Switchres 尝试在官方 AMD 驱动上动态添加或更新模式。
【注意】该功能目前处于实验阶段,默认处于禁用状态,且可能存在一些局限性和兼容性问题。

扫尾工作与硬件兼容性说明

在保存配置文件之前,我们需要处理最后一些细节,以确保系统的稳定性和良好的调试环境。

  • 硬件刷新权限(allow_hardware_refresh)
    通常建议保持为 0(关闭)。
    【注意】:开启此功能在 Windows 环境下可能会遇到同步不完美导致的显示错误、启动时的插拔提示音,以及因刷新硬件耗时过长而导致频繁切换分辨率的游戏出现卡顿。如果你使用的是 AMD 原厂驱动而非专用的 CRT 驱动(如 CRT Emudriver),通常无法支持低于 640×480 的超低分辨率,除非你使用的是 31kHz 的显示器。

  • 自定义视频时间字符串(custom_timing)
    bash
    custom_timing auto

    用于传递特定后端的参数(如 Powerstrip 的参数字符串)。


日志记录设置(Logging)

生活化类比:这就像是给你的系统雇了一个“速记员”。当一切正常时,你可能不需要他;但一旦出了故障,他记录下的信息就是帮你找回画面的关键线索。

  • 详细模式开关(verbose)
    设置为 0(关闭)或 1(开启)。
  • 详细程度等级(verbosity)
    • 0:保持安静,不发送任何消息。
    • 1:只在出错时大喊大叫(仅错误信息)。
    • 2:分享日常工作情况(常规信息,默认推荐)。
    • 3:事无巨细地汇报每一个细节(调试消息)。

操作步骤
在 SSH 终端中完成修改后,按下 [Ctrl]+[S] 键保存,随后按下 [Ctrl]+[X] 键退出编辑器。


选择你的显示器类型

为了能精准地生成视频模式(Modelines),Switchres 必须知道你的 CRT 显示器“胃口”有多大——也就是它能承受多大的带宽。

第一步:重新进入配置文件
使用 Batocera 文件夹管理器(按 F1)或者再次在终端输入命令:
nano /etc/switchres.ini

第二步:找到监控器设置行
向下滚动,找到 monitor 这一行。默认的设置通常是:
monitor arcade_15

第三步:根据你的设备进行重写
这里有几种最常见的 CRT 显示器预设模式:

预设名称 对应设备说明
generic_15 通用型 15.7 kHz CRT 电视(普通民用电视多选此项)
arcade_15 标准分辨率街机监视器(15.7 kHz)

【提示】:选择正确的预设至关重要。这就像是给电器插电前先确认电压一样,选错了可能会导致屏幕黑屏或显示异常。如果你不确定,通常从 generic_15 开始尝试是最稳妥的。

以下是为您优化后的教程:

选择合适的监视器预设

在配置文件的 monitor 选项中,有多种预设模式可供选择,每种模式代表了不同显示器的“脾气”:

预设代码 适用设备
pal PAL 制式电视 – 50 Hz/625 线
ntsc NTSC 制式电视 – 60 Hz/525 线
arcade_15ex 街机 15.7-16.5 KHz – 扩展分辨率
pc_31_120 PC CRT 显示器 31 KHz/120Hz
pc_70_120 PC CRT 显示器 70 KHz/120Hz
  • 经验法则:大多数标准 CRT 电视使用 arcade_15 效果很好。如果你的电视比较“挑食”,可以尝试 generic_15
  • 老电脑显示器:一般 1994 年以前产的用 pc_31_120,1994 年以后的用 pc_70_120

生活化类比:这就像是在给你的车选择燃油标号。大多数老车加“92号(arcade_15)”就行,有的进口老车可能得加“95号(generic_15)”才不抖动;而高性能跑车(电脑显示器)则需要专门的高标号燃油。

第一步:修改预设值
将默认的 arcade_15 替换为你选定的预设。例如,如果你决定使用 generic_15,请修改为:

monitor                   generic_15

第二步:保存并退出
如果你使用的是 nano 编辑器,请按下 180°C 组合键 [Ctrl]+[S] 保存,然后按下 [Ctrl]+[X] 退出。

【提示】如果你的显示设备非常特殊,不属于上述任何一种预设,你可能需要使用“自定义监视器类型(Custom monitor type)”。


调整文件权限

为了让系统能够正常读取和修改配置,我们需要调整文件的访问权限。

第三步:执行权限更改命令
在命令行中输入:

chmod 0777 /etc/switchres.ini

第四步:永久保存更改
再次运行保存命令,确保重启后设置依然有效:

batocera-save-overlay

生成显示模式参数

现在我们需要生成一组具体的显示模式参数(Modeline)

通常情况下,通过 xrandr(一种用于设置屏幕分辨率的工具)应用到特定显示的参数语法长这样:

xrandr -display :0.0 --newmode "320x240_60" 6.514560 320 333 364 416 240 242 245 261 -hsync -vsync
xrandr -display :0.0 --addmode "320x240_60"

这些内容最终会放入 /etc/X11/xinit/xinitrc 启动文件中。让我们开始动手生成它。

第五步:运行生成命令
在本例中,我们要为经典的 320×240@60Hz 分辨率生成参数。输入以下命令:

switchres 320 240 60 -i switchres.ini -c

第六步:获取输出结果
系统会返回一行类似下面的代码:

Switchres: Modeline "320x240_60 15.660000KHz 60.000000Hz" 6.514560 320 333 364 416 240 242 245 261 -hsync -vsync

请记下这段长代码,它是我们下一步配置的“核心秘籍”。

现在,我们已经根据之前设置的“街机 15.7 kHz 标准分辨率(arcade_15)”预设生成了专属的显示参数。接下来,我们要把这些深奥的代码变成显示器能听懂的指令。

将生成的参数应用到系统中

第一步:整理并简化参数代码
从刚才生成的代码中,复制 Modeline 单词之后的所有内容,并先保存到一个临时文档里。
原始代码长这样:
"320x240_60 15.660000KHz 60.000000Hz" 6.514560 320 333 364 416 240 242 245 261 -hsync -vsync

为了让它看起来更清爽,你可以删掉引号中多余的频率描述部分。
简化后的代码:
"320x240_60" 6.514560 320 333 364 416 240 242 245 261 -hsync -vsync

第二步:修改启动配置文件
打开配置文件 /etc/X11/xinit/xinitrc,将上面那行简化后的代码粘贴进去。

第三步:为显示模式“命名”
紧接着在那行代码的下方,再单独添加一行引号里的名称。
现在的配置文件看起来应该是这样的:

"320x240_60" 6.514560 320 333 364 416 240 242 245 261 -hsync -vsync
"320x240_60"

生活化类比:这就像是给你的显示器介绍一位新朋友。第一行是新朋友的“详细个人档案”(包含身高、体重、性格等精确参数),第二行则是这位朋友的“呼叫简称”。为什么要写两遍?你可以理解为系统需要先录入档案,再通过简称来正式点名。


其他生成工具

如果你不想使用命令行,也可以尝试使用在线工具 XFree86 Modeline Generator 来计算参数。不过,该工具的具体用法超出了本教程的讨论范围。


Switchres 常用指令小结

在调试过程中,你会经常用到以下指令:

1. 常规生成模式(读取配置文件):
如果你已经配置好了 switchres.ini,使用此命令:

switchres 320 240 60 -i switchres.ini -c

输出结果示例:
Switchres: Modeline "320x240_60 15.660000KHz 60.000000Hz" 6.514560 320 333 364 416 240 242 245 261 -hsync -vsync

2. 快速生成模式(跳过配置文件):
如果你不想读取 .ini 文件,也可以直接在命令里指定监视器类型(例如 generic_15):

switchres 320 240 60 -m generic_15 -c

输出结果示例:
Switchres: Modeline "320x240_60 15.660000KHz 60.000000Hz" 6.514560 320 333 364 416 240 242 245 261 -hsync -vsync

【提示】即便使用了直接指定参数的方式,输出的结果通常也是一致的。这非常适合用来快速测试不同监视器预设的效果。

强制生成特定显示模式

如果你需要强制系统生成一个特定的分辨率,可以使用“强制(Forced)”参数。

命令示例:

switchres 854 480 60 -f 854x480@60 -i switchres.ini -c

输出结果:

Switchres: Modeline "854x480_60i 15.690000KHz 60.000000Hz" 17.415900 854 889 971 1110 480 483 489 523 interlace -hsync -vsync

将新模式告知启动配置脚本(xinitrc)

生成好参数后,我们需要把这些数据喂给系统的启动配置脚本(xinitrc),让它知道在启动时该如何驱动你的 CRT 屏幕。

生活化类比:这就像是给家里的智能管家增加了一本“扩展菜谱”。之前他只知道怎么做大锅饭(默认分辨率),现在你把精准的配料表(Modeline)写进他的工作手册里,他就能根据你的要求做出精致的小炒了。

第一步:定位配置文件
打开文件 /etc/X11/xinit/xinitrc,向下滚动找到类似下面的代码块:

########################
#####-CRT 配置-#######
########################
##-默认分辨率-##
########################
xrandr -display :0.0 --newmode "640x480i" 13.10 640 664 728 832 480 484 490 525 interlace -hsync -vsync
xrandr -display :0.0 --addmode DVI-0 "640x480i"
xrandr -display :0.0 --output DVI-0 --mode "640x480i"
########################
########################

openbox --config-file /etc/openbox/rc.xml --startup "EmulationStation-standalone"

第二步:插入新模式指令
xrandr -display :0.0 --output DVI-0 --mode "640x480i" 这一行下面另起一行,先输入 xrandr -display :0.0 --newmode,然后粘贴你之前在临时文档中保存的那一长串参数代码。

第三步:将模式关联到输出端口
在接下来的新行中,输入 xrandr -display :0.0 --addmode,然后填入你的输出端口名称(如 DVI-0),最后粘贴显示模式的名称(即带双引号的那部分)。

按照这个逻辑,你的文件最终看起来应该是这样的:

########################
#####-CRT 配置-#######
########################
##-默认分辨率-##
########################
xrandr -display :0.0 --newmode "640x480i" 13.10 640 664 728 832 480 484 490 525 interlace -hsync -vsync
xrandr -display :0.0 --addmode DVI-0 "640x480i"
xrandr -display :0.0 --output DVI-0 --mode "640x480i"
########################
#####-参数列表-#######
########################
# 这里粘贴你刚才新增的指令

【提示】确保每一条指令都写在独立的一行。如果操作正确,这些新分辨率就会在系统底层注册成功,随时待命。

完成上一步的配置后,你的脚本文件末尾部分应该呈现如下结构:

xrandr -display :0.0 --newmode "320x240_60" 6.514560 320 333 364 416 240 242 245 261 -hsync -vsync
xrandr -display :0.0 --addmode DVI-0 "320x240_60"

openbox --config-file /etc/openbox/rc.xml --startup "EmulationStation-standalone"

最后一步:保存并重启
运行以下命令确保修改被永久保存,然后重启设备:

batocera-save-overlay
reboot

可选的分辨率参数列表(Modelines)

为了方便大家根据不同的游戏平台进行匹配,这里整理了一些常用的分辨率。你可以按照前文的方法,将需要的分辨率添加到你的配置中。

生活化类比:这些分辨率就像是显示器的“制服”。不同的游戏(如超任、PS2、街机)身材不同,你需要给它们挑选最贴身的那套“制服”,画面才不会出现难看的拉伸或模糊。

超大分辨率(Super Resolutions)

这类分辨率通常拥有极高的水平像素(2560),能有效解决 2D 游戏画面的像素对齐问题。
* 2560×240@60, 2560×248@58, 2560×256@57
* 2560×264@55, 2560×272@54, 2560×280@52
* 2560×288@51, 2560×448@60, 2560×464@60
* 2560×480@60, 2560×496@58, 2560×512@57
* 2560×544@54, 2560×560@52

模拟器/Wine/PC 专用分辨率

适用于各种主机模拟、电脑游戏或特定的系统环境。
* 240×240@60, 256×192@60, 288×224@60
* 320×180@60, 320×200@60, 320×240@60
* 320×240@60i(隔行扫描), 320×256@55, 320×256@60
* 352×240@60, 360×200@60, 360×240@60
* 380×284@60, 384×216@60, 384×480@60i
* 400×240@60, 416×240@60, 426×240@60
* 428×240@60, 456×256@55, 460×200@60
* 464×272@50, 480×270@50, 480×270@60
* 480×272@60, 512×480@60i, 640×240@60
* 640×360@60, 640×480@60, 640×480@60i
* 854×480@60i(用于将 16:9 压缩回 4:3 比例显示)


关于 Switchres 的最小点时钟频率

以上大部分技术细节都参考自 GroovyMame 的官方百科。

关于 CRT 的冷知识
你知道吗?CRT 监视器接收到的数据其实比它们实际展示出来的要多。这些“额外”的数据位被藏在了屏幕顶端和底部的边框之外。这个特性对于理解后续的扫描频率和画面定位非常关键。

【提示】如果你在设置某些极低的分辨率时发现屏幕无法同步,通常是因为触发了显卡的最小点时钟频率(Minimum Dot Clock)限制。此时建议优先使用上述的“超大分辨率(Super Resolutions)”,通过横向拉伸像素来“骗过”显卡的限制,同时依然保持纵向的原生扫描线效果。

认识点时钟与带宽限制

我们要聊聊点时钟(Dot clock)。简单来说,它代表了显示器每秒钟画出的像素点数量。

你可以通过这个公式算出来:宽度 × 实际水平扫描线数量 × 每秒帧数(FPS)
这里的“实际水平扫描线数量”通常比画面的显示高度要稍微多出一点。

生活化类比:想象你在画一幅填色画。点时钟就像是你挥动画笔的速度。如果你每秒钟能画出 500 万个点,那你填满整张画的速度就非常快。

举个例子:一个理论上的 320×240 @ 60 FPS 分辨率,实际计算方式可能是 $320 \times 262.5 \times 60 = 5,040,000$ 像素/秒。技术上通常用 MHz 来衡量点时钟,但为了方便理解,我们直接称之为“带宽(Bandwidth)”,单位用“像素/秒(p/s)”。

为什么你的显卡会“罢工”?

现代显卡都有一个最低带宽限制。如果你的设置低于这个门槛,显卡就干脆不渲染画面,甚至直接卡死。
* 常见的最低门槛包括 8 Mp/s12 Mp/s 甚至 25 Mp/s(M 代表百万)。
* 【注意】:不同的输出端口,门槛也不同。通常数字端口(如 HDMI/DP)的最低带宽要求比模拟端口更高。

当我们想要在 CRT 上跑那些只有 5 Mp/s 的复古低清画面时,显卡会因为觉得“这活儿太轻了,不值得开工”而拒绝运行。


终极方案:超分辨率(Super resolutions)

CRT 显示器有一个迷人的特性:它不关心像素,它只关心扫描线

利用这个特性,我们可以采取一种“瞒天过海”的策略:我们在每一行扫描线里塞进超级多的像素点,从而强行拔高总带宽,跨过显卡的开工门槛。这就是所谓的超分辨率

操作准则:
* 成倍缩放:通常建议将原始画面的宽度设置为整数倍(例如原始宽 320,我们就设为 2560,即 8 倍)。这样当 CRT 将画面收缩显示时,像素点之间就不会互相重叠挤压。
* 【注意】:虽然超分辨率很好用,但也要适度。CRT 内部的晶体管和电子元器件处理像素的能力也是有上限的。如果每秒灌入的像素点过多,可能会导致设备无响应,甚至造成硬件损坏

为了解决带宽不足的问题,我们将请出 Switchres 来帮我们计算合适的超分辨率(Super Resolution)。它非常聪明,既能保证新分辨率是原始画面宽度的整数倍,又能确保总带宽满足显卡的“胃口”。

通常建议将 800万像素/秒(8 Mp/s) 作为起步值进行调试,如果你的硬件还是无法显示,再逐步调高。

生活化类比:定制超宽画布

想象你要在一张宽度有限的纸上画一棵树。如果纸太窄,打印机(显卡)可能会报错。Switchres 的做法不是把树拉伸变形,而是给你一张超级宽的纸(比如 4 倍宽),并在上面画出 4 个一模一样的像素点来代表原来的 1 个像素。这样纸张的总宽度够了,显卡愿意工作了,而 CRT 显示器在扫描时会自动把这些多出来的点压在一起,最后你看到的依然是那个比例完美的画面。


举个例子:640×480 的进阶

假设你正在玩一个原生分辨率为 640×480 @ 60 FPS 的游戏,而你的显卡要求最低带宽必须达到 25 Mp/s
1. 原始计算:$640 \times 480 \times 60 = 18,432,000$ 像素/秒。这显然没达到 2500 万的要求。
2. Switchres 介入:它会将分辨率计算为 1280×480
3. 最终带宽:因为 1280 是 640 的整数倍,计算结果变为 $1280 \times 480 \times 60 = 36,864,000$ 像素/秒。这远超显卡门槛,画面就能完美显示了。

同理,对于 256×224 的游戏,它会不断尝试 512×224768×224 等倍数,直到满足你在配置文件(INI)中设置的最低带宽(点时钟)。

【注意】超分辨率目前仅在 MAMELibretro 核心中受支持。


测试显示模式(Modelines)

在正式使用前,建议先进行画面测试,确保你设置的参数能正常点亮屏幕。

第一步:准备工作
1. 使用 WinScp 或类似工具,确保你的 switchres.ini 已经根据你的显示器配置妥当。
2. 通过 SSH 远程连接到 Batocera。
3. 给你的 Batocera 机器插上一把实体键盘

第二步:退出系统界面
为了腾出控制权进行测试,需要先关闭 Emulation Station

/etc/init.d/S31emulationstation stop

第三步:运行网格测试
在 SSH 终端输入以下命令来测试 640×480@60 模式(系统会根据你配置的显示器档位进行匹配):

DISPLAY=:0 switchres 640 480 60 -i switchres.ini -s -l grid
  • 切换模式:测试画面出来后,按键盘上的 [Tab] 键可以在两种网格模式间切换。
  • 退出测试:按键盘上的 [Esc] 键退出当前模式。

【注意】请务必通过连接在机器上的物理键盘按 Esc 退出。千万不要在 SSH 客户端里使用 Pause Break 键强行中断,否则系统可能会卡死,必须重启才能恢复。

第四步:重回系统界面
测试完成后,使用以下命令重启界面:

batocera-es-swissknife --restart

测试你的 Switchres 配置

在正式使用之前,我们可以通过手动测试来验证 switchres.ini 的设置是否匹配你的硬件。这里涉及到一个关键参数:最小点时钟(dotclock_min)

  • 默认值:0。
  • 调整范围:0 到 25(支持小数点,如 1.1、8.3、10.5 等)。

生活化类比:点时钟就像是显卡的“起步速度”。有些显卡像老式的柴油车,怠速太低(点时钟太小)就容易熄火(无法显示画面)。如果你的显卡比较现代,它可能无法理解那些极低速的信号,这时你就需要手动调高这个“起步速度”。

测试建议:始终从默认值 0 开始测试。如果你的显卡能处理极低的分辨率,就不需要修改它。

街机模式(Arcade Modelines)测试

以经典的街机游戏《小鸟(Dottori Kun)》为例,这个游戏的分辨率极低,是检验显卡兼容性的“试金石”。

操作步骤
在 SSH 终端中输入以下命令:

DISPLAY=:0 switchres 128 192 61.035156 -i switchres.ini -s -l grid

AMD 显卡故障排除:画面撕裂与冻结

如果你在 MAME 或 RetroArch 模拟器中发现画面滚动不平滑、有微小的卡顿(Microstutters),通常是因为显卡驱动自带的“抗撕裂”功能与模拟器冲突了。

解决画面卡顿(禁用 TearFree)

我们需要在驱动配置文件中手动关闭 TearFree(抗撕裂) 选项。该文件位于 /etc/X11/xorg.conf.d 目录下。

第一步:确定你的显卡架构
* 新架构(GCN 3 及以上,包括 RDNA):修改 20-amdgpu.conf
* 老架构(TeraScale 或 GCN 1/2):修改 20-radeon.conf

第二步:修改配置文件内容
根据你的显卡类型,将 Option "TearFree" 设置为 "false"

  • 对于 amdgpu 驱动(较新显卡)
Section "OutputClass"
Identifier "Fix AMD Tearing"
Driver "amdgpu"
MatchDriver "amdgpu"
Option "TearFree" "false"
EndSection
  • 对于 radeon 驱动(较旧显卡)
Section "OutputClass"
Identifier "Fix AMD Radeon Tearing"
Driver "radeon"
MatchDriver "radeon"
Option "TearFree" "false"
EndSection

第三步:保存并重启
务必执行 batocera-save-overlay 命令,然后重启系统。


解决游戏或系统界面冻结

有些用户反馈系统会无故死机或画面冻结。
【提示】在 Batocera v34(测试版)及更高版本中,Calamity 发布的隔行扫描分辨率补丁(Interlaced resolution patch)已经基本解决了这个问题。

如果你仍在使用旧版本或依然遇到冻结,可以尝试调整 直接渲染架构(DRI,Direct Rendering Infrastructure) 的版本。

操作步骤
在驱动配置文件中添加特定的 DRI 等级。
* amdgpu 驱动:添加 Option "DRI" "3"
* radeon 驱动:添加 Option "DRI" "2"

代码示例(以 20-amdgpu.conf 为例)

Section "OutputClass"
...

【注意】不同的 DRI 版本决定了显卡与显示设备沟通的“协议”。如果协议版本不匹配,就容易出现“沟通不畅”导致系统直接罢工(冻结)。

接着上文,如果你的系统遇到了冻结问题,请按照你的显卡型号对驱动配置文件进行最后的修补。

完善驱动配置(解决冻结与撕裂)

第一步:根据显卡型号修改配置

  • 针对较新的显卡(amdgpu 驱动):
    修改 /etc/X11/xorg.conf.d/20-amdgpu.conf,确保内容如下:
    text
    Section "OutputClass"
    Identifier "Fix AMD Tearing"
    Driver "amdgpu"
    MatchDriver "amdgpu"
    Option "TearFree" "false"
    Option "DRI" "3"
    EndSection

  • 针对较旧的显卡(radeon 驱动):
    修改 /etc/X11/xorg.conf.d/20-radeon.conf,确保内容如下:
    text
    Section "OutputClass"
    Identifier "Fix AMD Radeon Tearing"
    Driver "radeon"
    MatchDriver "radeon"
    Option "TearFree" "false"
    Option "DRI" "2"
    EndSection

第二步:保存并生效
【提示】修改完成后,别忘了运行 batocera-save-overlay 命令,然后重启机器使配置生效。


术语小科普

  • 抗撕裂(TearFree):这是一种硬件层面的页面翻转机制,用来防止画面撕裂。
  • 微卡顿(Microstutter):指画面偶尔出现的、不规律的轻微掉帧。
  • 帧平滑(Frame-pacing):指每一帧画面在时间上分布不均匀,会导致视觉上的不连贯。

配置 Libretro 核心以适配 Switchres

为了让 Switchres 在低分辨率下完美运行,我们需要对 RetroArch(RA)进行一些优化。

优化低分辨率下的显示效果

RetroArch 默认的菜单和通知是为高清屏幕设计的。如果你在低清 CRT 屏幕上直接打开它们,你会发现菜单变得模糊不清,或者通知弹窗大得离谱,直接占满了整个屏幕。

生活化类比:这就像是在那种古老的小灵通手机屏幕上打开现代的网页,你会发现一个按钮就占满了整个屏幕。为了看清内容,我们需要把界面换成那种简单清晰的“老人机模式”。

操作步骤:

第一步:打开系统配置文件
定位到 /userdata/system/batocera.conf 文件。

第二步:添加 CRT 专项配置
在文件中加入以下内容,这将启用专门为小屏幕设计的 RGUI 菜单系统,并禁用那些在 CRT 上毫无意义的画面后处理增强功能:

## CRT 专项配置
# 使用适合低分辨率的 RGUI 菜单驱动
global.RetroArch.menu_driver=rgui
# 开启高级设置菜单
global.RetroArch.menu_show_advanced_settings=true
# 禁用会导致排版混乱的图形小部件
global.RetroArch.menu_enable_widgets=false
# 关闭平滑处理(CRT 不需要软模糊)
global.smooth=0

第三步:追求极致的复古感(可选)
如果你想获得最纯粹、不被现代功能干扰的体验,还可以添加以下设置来关闭即时回放、自动存档、着色器和边框遮罩(这些也可以在系统的“游戏设置”菜单中手动开关):

# 关闭回放功能
global.rewind=0
# 关闭自动保存
global.autosave=0
# 禁用所有着色器
global.shaderset=none
# 禁用边框遮罩
global.bezel=none

【提示】通过这些设置,你的模拟器菜单在 CRT 上将变得非常锐利且易于操作。

如果你只打算玩 4:3 比例的游戏系统,强烈建议关闭边框遮罩(Bezels)。


为模拟器核心和目录设置分辨率覆盖

你可以通过 RetroArch 的核心覆盖(Core Override)功能,为不同的游戏机单独定义分辨率。虽然在 Batocera 中的操作与原版 RetroArch 略有不同,但如果你经常使用 RetroArch,这个过程对你来说会非常亲切。

生活化类比:这就像是给你的“万能播放器”设置专人专座。虽然播放器默认有一套规矩,但你可以规定:当它运行“超级任天堂”这个频道时,必须穿上 240p 的特制制服;而运行“PS2”频道时,则换上 480i 的制服。

第一步:复制并重命名配置文件

我们需要在核心配置文件夹中创建一个专门的配置文件。以 SSH 方式为例,将基础的 switchres.ini 复制到对应的模拟器核心目录下:

cp /etc/switchres.ini /userdata/system/.config/retroarch/config/[核心名称]/[核心名称].switchres.ini

【提示】请务必将代码中的 [核心名称] 替换为你实际要配置的 Libretro 核心名字(例如 snes9x)。

第二步:修改用户模式参数

打开刚刚复制好的文件,找到 user_mode 这一行:

# 强制用户模式,格式为:宽 x 高 @ 刷新率。这里可以用 0 作为通配符。
# 例如:user_mode 0x240 -> Switchres 会根据游戏需求自由选择宽度,但高度固定为 240。
user_mode                 auto

第三步:指定目标分辨率

auto 修改为你想要强制输出的分辨率。例如,如果你想让该核心强制输出 576i,则修改为:

user_mode                 768x576

操作感提示:修改完成后保存。此时,RetroArch 就会强制以 576i 的分辨率为该核心输出画面。Switchres 依然会发挥它的黑科技作用,自动计算出最合适的超分辨率(Super Resolution),只是它会把这个 576i 当作模拟器的“原生输出分辨率”来处理。

你可以通过维基百科搜索特定游戏机的原始分辨率。虽然 Libretro 的官方文档也是个参考,但截稿前,他们似乎还缺失很多系统的几何参数信息。


在开启 Switchres 时强制开启“整数缩放”

虽然 Switchres 在自动处理超分辨率(Super Resolutions)方面表现卓越,但如果你想在 CRT 电视上获得完美的整数缩放(Integer Scaling)效果该怎么办呢?

生活化类比:这就像是在不同尺寸的相框里放照片。如果相框比照片大一点,普通的缩放会把照片拉宽,导致边缘模糊;而“整数缩放”则是严格按照 2 倍、3 倍这样的比例放大,确保照片里的每个像素点依然方方正正,清晰可见。

对于像 Game Boy Advance (GBA) 这样的掌机核心,它们并不适合以 480i 这种隔行扫描模式显示。你可能更希望将 CRT 切换到逐行扫描模式(Progressive Scan)(即把 480 的高度减半),以正确的纵横比显示最原始的分辨率。

这需要结合 Switchres 配置和 RetroArch 核心覆盖来实现。

第一步:配置核心专属的 Switchres 文件

按照前一章节的方法,在 /userdata/system/.config/retroarch/config/[核心名称]/ 目录下创建 [核心名称].switchres.ini 文件。
我们需要将输出信号限制在电视能处理的低高度(240 线)上,以强制开启逐行扫描。

在文件中找到并修改这一行(宽度不那么重要,关键是高度):

user_mode                 320x240

第二步:创建核心专属的配置文件

除了 Switchres 的设置,我们还需要调整 RetroArch 本身的视频输出参数。

  1. 在同一个核心配置目录下,创建一个名为 [核心名称].cfg 的文本文件。
  2. 例如,如果你使用的是 mGBA 核心,那么文件路径应为:/userdata/system/.config/retroarch/config/mGBA/mGBA.cfg

第三步:录入缩放参数

打开刚才创建的 .cfg 文件,输入以下关键参数:

# 设置纵横比索引为自定义模式
aspect_ratio_index = "#"
# 设置自定义视口的显示高度
custom_viewport_height = "#"

【提示】以上代码中的 # 号需要替换为具体的数值(接下来的章节会详细介绍如何计算这些数值)。虽然这些设置也可以通过 RetroArch 菜单中的 设置(Settings) -> 视频(Video) -> CRT SwitchRes 进行调整,但在这里直接通过脚本设置会更加高效且一步到位。

custom_viewport_width = "#"
video_scale_integer = "true"

在上述配置中,我们需要将“自定义视口(Custom Viewport)”的分辨率设置为该模拟系统的原生分辨率。

以 Game Boy Advance (GBA) 为例,其对应的 mGBA.cfg 配置文件内容如下:

设置为 23 通常对应 RetroArch 中的“自定义”比例模式

aspect_ratio_index = "23"

GBA 原生高度为 160 像素

custom_viewport_height = "160"

GBA 原生宽度为 240 像素

custom_viewport_width = "240"

开启整数缩放

video_scale_integer = "true"

显示效果:
通过这种设置,GBA 的画面将以像素级完美的精度,在你的 CRT 屏幕中心进行整数缩放
* 画面表现:GBA 画面会稍微缩小,端坐在 CRT 屏幕的中央。
* Switchres 测试:系统将以 GBA 的原生分辨率进行精准输出。

【提示】关于核心和目录覆盖配置的更多信息,可以参考 Libretro 的官方文档(但请记住,Batocera 的文件路径与标准版不同)。


Libretro 全局 Switchres 配置

【注意】在进行后续操作前,请务必确保你已经按照前文教程配置好了 switchres.ini

第一步:在 RetroArch 中开启配置

使用手柄或键盘,在 Batocera 中启动任意一个 Libretro 核心的游戏。
* 例如:核心选择 Atari 2600,游戏选择《H.E.R.O.》。

第二步:调整菜单设置

唤出 RetroArch 菜单,并按以下顺序进行配置(顺序非常重要):
1. 主菜单 (Main Menu) -> 视频 (Video) -> CRT SwitchRes -> 使用高分辨率菜单 (Use High Resolution Menu)(可选开启)。
2. 主菜单 (Main Menu) -> 视频 (Video) -> CRT SwitchRes -> CRT 超分辨率 (CRT Super Resolution) 设置为 原生 (Native)
3. 主菜单 (Main Menu) -> 视频 (Video) -> CRT SwitchRes -> CRT SwitchRes [INI] 设置为 开启

此时,屏幕应该会自动切换到 240p 或 480i 模式。

第三步:保存并退出

  1. 前往 设置 (Settings) -> 配置 (Configuration) -> 退出时保存配置 (Save Configuration on Quit) 设置为 开启 [ON]
  2. 最后,直接退出游戏回到系统界面(EmulationStation),配置将自动保存。

针对特定核心的分辨率覆盖

如果你希望某个特定的核心使用特殊设置,而不干扰其他核心,可以按照以下步骤操作。

操作步骤:
同样使用手柄或键盘,在 Batocera 中启动你想要单独配置的 Libretro 核心和游戏。
* 例如:核心 Atari 2600,游戏《H.E.R.O.》。

生活化类比:这就像是给家里所有的灯设置了一个“总开关(全局配置)”,但你可以给书房的灯安装一个“独立调光器(核心覆盖)”,这样无论客厅的灯怎么亮,书房都能保持你最喜欢的亮度。

如果你希望某个特定的模拟器核心拥有“特权”,使用与全局设置不同的分辨率,可以按照以下步骤进行操作。

操作步骤:

第一步:进入核心配置菜单
在游戏中唤出 RetroArch 菜单,并按以下顺序进行设置(请严格遵守顺序):
1. 主菜单 (Main Menu) —— 设置 (Settings) —— 配置 (Configuration) —— 退出时保存配置 (Save Configuration on Quit):设置为 关闭 [OFF](防止干扰全局配置)。
2. 主菜单 (Main Menu) —— 设置 (Settings) —— 配置 (Configuration) —— 使用全局核心选项文件 (Use Global Core Option Files):设置为 关闭 [OFF]
3. 主菜单 (Main Menu) —— 视频 (Video) —— CRT SwitchRes —— 使用高分辨率菜单 (Use High Resolution Menu):可选开启。
4. 主菜单 (Main Menu) —— 视频 (Video) —— CRT SwitchRes —— CRT 超分辨率 (CRT Super Resolution):设置为 原生 (Native)
5. 主菜单 (Main Menu) —— 视频 (Video) —— CRT SwitchRes —— CRT SwitchRes [INI]:开启后,屏幕应自动切换至 240p 或 480i。

第二步:保存核心覆盖设置
为了让改动生效且不丢失,前往:
快捷菜单 (Quick Menu) —— 覆盖 (Overrides) —— 保存核心覆盖 (Save Core overrides)


故障排除(Troubleshooting)

如果配置过程中改乱了,画面变黑或显示异常,别担心,你可以随时“重来”。

生活化类比:这就像是给房间装修,如果你把墙刷错了颜色,最简单的办法就是撕掉壁纸重新贴。删除这些配置文件,系统就会恢复到最原始的“清水房”状态。

  • 删除特定核心的设置
    前往以下目录,删除对应“核心名称”的文件夹:
    /userdata/system/.config/retroarch/config/核心名称
  • 重置所有 RetroArch 设置
    如果你想彻底重来,可以删除以下路径中的 retroarch 文件夹(【注意】:仅删除其中的子文件夹,不要删错目录):
    /userdata/system/.config//userdata/system/configs/
  • 使用终极重置工具
    在终端输入以下命令直接“一键还原”:
    batocera-es-swissknife --reset-ra
    【注意】:运行后请重启设备,系统会重新生成一份干净的配置。

使用 Switchres 创建自定义开机分辨率

如果你使用 PC CRT 显示器,可能希望在开机启动时就使用 1024×768@60Hz。我们可以通过创建一个自定义的扩展显示识别数据(EDID)来实现。

操作步骤:

第一步:生成 EDID 二进制文件
我们将使用 pc_31_120(31-120Hz PC 显像管预设)来生成 1024×768 的数据。输入指令:

switchres 1024 768 60 -m pc_31_120 -e

运行后,你会得到一个名为 pc_31_120.bin 的文件。

第二步:创建存放目录并移动文件
1. 创建系统固件文件夹:
mkdir /lib/firmware/edid/
2. 将生成的二进制文件移动进去:
mv pc_31_120.bin /lib/firmware/edid/

第三步:寻找引导配置文件
接下来,我们需要在系统引导文件(syslinux 文件)中添加相关指令。

修改系统引导参数

为了让系统在启动的第一时间就加载我们刚刚创建的 EDID 文件,我们需要修改系统的“启动说明书”——也就是引导配置文件。

第一步:定位配置文件
根据你电脑的启动模式(老式 BIOS 或现代 UEFI),配置文件的位置会有所不同:
* 传统模式(Legacy):文件通常位于 /boot/syslinux.cfg/boot/boot/syslinux.cfg
* 现代模式(UEFI):文件通常位于 /boot/EFI/syslinux.cfg/boot/EFI/BOOT/syslinux.cfg

第二步:修改视频输出指令
在文件中找到以 APPEND 开头的那一行,并在后面加入显示参数。格式为:video=你的输出接口:e drm.edid_firmware=你的输出接口:edid/pc_31_120.bin

实战示例:
假设你的显卡输出接口是 DVI-I-1,那么修改后的整行指令看起来应该是这样的:

APPEND label=Batocera console=tty3 quiet loglevel=0 vt.global_cursor_default=0 mitigations=off video=DVI-I-1:e drm.edid_firmware=DVI-I-1:edid/pc_31_120.bin

为 CRT 屏幕配置 GroovyMame

默认情况下,GroovyMame 的菜单是为高清电视(HDTV)设计的,直接在 CRT 屏幕上显示时,字体会变得模糊不清,根本没法看。

生活化类比:这就像是在那种古老的小黑白电视上看现代的高清字幕,字全缩成了一团黑影。虽然眯起眼睛拼命看也能勉强辨认,但我们可以通过“放大字体”和“更换皮肤”来彻底解决它。

为了修复显示问题,我们需要先生成默认配置文件并将其移动到用户数据区。

第一步:进入 MAME 程序目录
执行命令:
cd /usr/bin/MAME

第二步:生成初始化配置文件
执行 MAME 脚本并带上创建参数(Create Config):
./MAME -cc
系统会在当前目录下生成以下三个文件:
* MAME.ini
* plugin.ini
* ui.ini

第三步:创建并移动文件到用户目录
1. 在用户数据区创建一个隐藏文件夹:
mkdir /userdata/system/.MAME/
2. 将刚才生成的配置文件移动过去:
mv /usr/bin/MAME/*.ini /userdata/system/.MAME/


优化 MAME.ini 设置

现在我们要动手调教这些配置文件了。

第一步:打开 MAME.ini
你可以继续在 SSH 中使用 nano 命令打开,或者在 Windows 共享目录中使用 Notepad++ 开启。
nano /userdata/system/.MAME/MAME.ini

第二步:配置字体路径
找到 核心搜索路径选项(CORE SEARCH PATH OPTIONS) 部分,进行如下修改:
将:

fontpath                  .

改为:

fontpath                  /usr/share/fonts/TTF/

【提示】这样设置后,MAME 就能调用 Batocera 系统里那些既酷炫又清晰的字体了!

在众多选项中,我们只需要重点关注以下几项核心设置。

优化 MAME.ini 配置

继续编辑 /userdata/system/.MAME/MAME.ini 文件,进行最后的调整:

  • 更换菜单字体
    核心杂项选项(CORE MISC OPTIONS) 下,找到 uifont
    将:uifont default 改为:uifont uismall.bdf
    作用:这将把菜单字体换成一种在 CRT 屏幕上非常易读的专用字体。
  • 激活 Switchres
    输出设置全屏选项(OSD FULL SCREEN OPTIONS) 下,找到 modesetting
    将:modesetting 0 改为:modesetting 1
    作用:强制 MAME 开启 Switchres 功能,从而匹配正确的扫描频率。
  • 保存并退出:按下 [Ctrl]+[S] 保存,然后关闭文件。

优化 ui.ini 配置

接下来,我们需要调整用户界面(UI)的显示比例。

第一步:打开配置文件
使用编辑器打开 /userdata/system/.MAME/ui.ini

第二步:调整文字大小与行数
界面选项(UI OPTIONS) 下进行以下修改:
1. 将 infos_text_size 0.75 改为 infos_text_size 1.00
生活化类比:这就像是给家里的老人机调大了字体。我们要让文字“变大变强(Embiggen)”,让你不用凑近屏幕也能看清。
2. 将 font_rows 30 改为 font_rows 19
提示:因为我们把字体变大了,所以需要减少每屏显示的行数,防止文字直接“滚”到屏幕外面去。

第三步:跳过警告消息(可选)
如果你不想每次看到“该机器存在已知问题”的弹窗,可以:
skip_warnings 0 改为 skip_warnings 1


在 Batocera 中完成最后设置

完成上述步骤后,当你再次启动 GroovyMame 时,CRT 屏幕上的菜单将变得清晰锐利。

最后一步:在系统界面中全局应用
为了让所有 MAME 游戏都默认使用这一套设置,请在 EmulationStation 界面进入 MAME 系统,按下手柄的 [SELECT] 键打开快捷菜单,进入 高级系统选项(ADVANCED SYSTEM OPTIONS),按如下方式配置:

选项名称 设置值
模拟器(EMULATOR) MAME
视频模式(VIDEO MODE) AUTO
装饰(DECORATION) NONE (无)
图形后端(GRAPHICS BACKEND) AUTO
BGFX 后端(BGFX BACKEND) AUTO
BGFX 视频滤镜(BGFX VIDEO FILTER) AUTO
CRT 动态分辨率切换(CRT SWITCHRES) ON (开启)

【提示】如果你想对比自己的配置文件是否修改正确,可以参考已配置完成的样本(注意:样本可能对应旧版 MAME),但按照本教程手动操作通常是最稳妥的做法。

在完成 MAME 的配置后,我们最后再来处理一下画面旋转以及 Dolphin 模拟器(GameCube/Wii)的一些进阶细节。

  • 纵向模式(TATE MODE):设置为 AUTO(如果你打算物理旋转你的 CRT 显示器来玩那种纵向街机游戏,请根据实际情况调整此项)。

进阶模拟器杂项配置

针对特定的模拟器,我们需要进行一些“微操”来确保画面能完美填满你的 CRT 屏幕。

Dolphin 模拟器:让画面填满窗口

在默认情况下,Dolphin 会将 4:3 比例的数值设为 2,这在普通显示器上没问题,但在 CRT 上往往无法填满屏幕,导致左右两侧出现讨厌的黑边。

生活化类比:这就像是你穿了一件“标准码”的衬衫,但在你身上(CRT 屏幕)总觉得袖子短了一截。我们需要把衬衫改成“加长版”,让它彻底覆盖你的手腕。

  • 如果你使用的是 Batocera v33 及以上版本
    简单多了!只需进入 高级系统设置(ADVANCED SYSTEM SETTINGS),将 GameCube 或 Wii 的纵横比直接设置为 “FULL” 即可。

  • 如果你使用的是 Batocera v32 及更低版本
    我们需要手动修改脚本文件。

第一步:进入脚本目录
在终端导航至以下路径:
/usr/lib/python3.9/site-packages/configgen/generators/Dolphin/

第二步:修改 dolphinGenerator.py 文件
找到关于比例(Ratio)的代码段:

# 修改前
if config["ratio"] == "4/3":
    return 2

将返回值修改为 3(这代表“拉伸至窗口”):

# 修改后
if config["ratio"] == "4/3":
    return 3

第三步:保存更改
运行以下命令保存系统覆盖层,并将核心纵横比设置为 4:3:
Batocera-save-overlay


Dolphin 模拟器:关闭屏幕通知

在低分辨率的 CRT 上,模拟器的弹窗通知往往会显得非常突兀且干扰视线。

操作步骤:
在同一个配置文件中,找到处理界面(Interface)的部分,将屏幕显示消息(OnScreenDisplayMessages)从 "True" 修改为 "False"

修改前:

# PanicHandlers 显示消息
dolphinSettings.set("Interface", "UsePanicHandlers",        '"False"')
dolphinSettings.set("Interface", "OnScreenDisplayMessages", '"True"')

修改后:

# PanicHandlers 显示消息
dolphinSettings.set("Interface", "UsePanicHandlers",        '"False"')
# 这一行已修改为 False
dolphinSettings.set("Interface", "OnScreenDisplayMessages", '"False"')

【提示】关闭这些通知后,你的游戏画面将变得更加干净,不再有那些破坏沉浸感的高清字体弹窗。

在完成上述修改后,记得执行最后一步操作:

操作步骤:
输入命令 batocera-save-overlay 以保存你的更改。


禁用 Libretro 强制通知消息

【提示】虽然这一问题在较新版本中已得到修复,但如果你仍受到通知弹窗的困扰(例如在低分辨率下通知文字过大),本节内容将非常有用。

有时候,Batocera 的配置生成脚本(Config generator scripts)会自动覆盖你在 batocera.conf 中手动设置的偏好。要彻底解决这个问题,我们需要从脚本层面进行“手术”。

生活化类比:这就像是你虽然在电视遥控器上关掉了字幕,但电视机内部的“总管”(脚本)每次开机都会强制把字幕再打开。我们要做的就是直接去后台修改总管的指令,让他默认就保持关闭状态。

第一步:进入脚本目录
在终端导航至以下路径:
/usr/lib/python3.9/site-packages/configgen/generators/libretro/

第二步:修改配置文件
打开 libretroConfig.py 文件,找到关于视频字体启用的代码行。
将:

retroarchConfig['video_font_enable'] = '"true"'

改为:

retroarchConfig['video_font_enable'] = '"false"'

第三步:永久保存修改
【注意】在 Batocera 中,对系统目录的修改需要手动保存覆盖层,否则重启后会失效。请输入以下命令:

batocera-save-overlay

通过以上步骤,Libretro 核心生成的那些通知文字就不会再干扰你纯净的 CRT 画面了。


原文: Batocera连接CRT显示器 • 翻译: DIY8 Bot

© 版权声明
评论 抢沙发

请登录后发表评论

    暂无评论内容