NES 复合视频信号为何摇摇晃晃?——深入解析红白机的视频输出之谜
NES(即国内玩家熟知的"红白机"/Famicom)的复合视频输出为什么画面总是摇摇晃晃的?以 Mighty Bomb Jack 的标题画面为例——明明是一个静态画面,看起来却一直在抖动。更诡异的是,这种抖动并非普通的外部干扰,因为干扰通常是随机的,而 NES 的抖动呈现的是规律性的循环模式。
解释 1:外部干扰?
干扰通常是随机的,不会形成固定的图案。但 NES 的画面抖动在边缘呈现出重复的锯齿状图案,这说明问题根源在内部,而非外部干扰。
解释 2:色同步信号(colorburst)
NTSC 的色副载波(color subcarrier)频率为 3.579545 MHz,行频(horizontal scan rate)为 15.734 kHz,两者比值恰好是 227.5。RCA 在设计 NTSC 标准时,刻意让色载波频率等于行频的半整数倍,这样色度信号就能在相邻行之间自然抵消,便于用梳状滤波器分离亮度与色度信号。
但 NES 的情况并非如此——NES 每行并非 227.5 个色同步周期,而是约 227.33 个。这个微小的偏差意味着色度信号的相位每行都会发生偏移,形成了三行重复的抖动模式。
作为对比:
- Apple II:228 个色周期/行(Woz 额外增加了硬件来拉伸时钟)
- PC Engine / SuperGrafx:精确的 227.5 个色周期/行
解释 3:NES 的特殊架构设计
NES(Famicom)的设计始于 80 年代初期,其 PPU(Picture Processing Unit)内部不经过 RGB 信号通路,而是直接输出复合视频(composite video)或数字视频数据。这就意味着 NES 的所有视频输出问题都根植于它的硬件时钟架构之中。
NES 的主晶振频率为 21.47727 MHz,正好是色副载波频率的 6 倍。PPU 利用时钟信号的上升沿(rising edge)和下降沿(falling edge),获得了相当于 12 倍色副载波的基准速率——即 12 种可能的相位状态。
时钟分频关系:
- 晶振 ÷ 12 = CPU(6502)时钟
1.7897725 MHz - 晶振 ÷ 4 = PPU 点时钟(dot clock)
5.3693175 MHz - 每行 341 个点,行频约为
15.7458 kHz
关键在于:÷6 得到的色副载波与 ÷4 得到的点时钟之间的关系,导致每行尴尬地塞进了 227.33 个色同步周期——而非标准的 227.5。正是这个 0.17 个周期的差异,造就了反复出现的三行重复抖动模式。
Ricoh 工程师的解决方案:"史上最懒的隔行扫描"
为了缓解这个问题,Ricoh 的工程师在垂直消隐区间(vertical blanking interval)的最后一行做了一个小动作:让 NES 交替使用 341 点和 340 点(即"缺失点"/missing dot)。这样一来,原本的三帧重复模式就被变成了两帧交替模式,肉眼看起来平滑了不少。
需要注意的是:这个仅适用于 NTSC 主机。PAL 主机拥有完全不同的时钟系统,不受此问题困扰。
Rare 的例外:Battletoads
Rare 开发的 Battletoads 有一个特殊的做法——每帧都会临时关闭渲染(rendering),以获取更多的 CHR-RAM 访问时间。这个做法意外地暴露了 NES 在视频输出上的原始设计缺陷。
如上图所示,四帧对比中第一帧和第四帧几乎完全相同——这直接暴露了三帧重复模式的底层结构。即便 Ricoh 的"缺失点"技巧在一定程度上掩盖了这一问题,Battletoads 的激进优化还是让这个原始设计痕迹无所遁形。
原文出处:Composite Video on the NES: Why's it so wobbly? — nicole.express