Reed's News
← 返回精选

Sega CD《Silpheed》的艺术与工程

Tech 86 ibobev 2026/7/13 1425 字 原文 ↗

上世纪90年代是家用游戏机技术突飞猛进的十年https://fabiensanglard.net/silpheed/arch_b.png。每一代新机都在算力与画质上实现了实打实的突破,没有半点妥协。

但90年代中期CD-ROM光驱的普及,却是个颇为反常的插曲。尽管CD-ROM拥有640MiB的存储空间,是传统卡带的320倍https://fabiensanglard.net/silpheed/arch_sprites.png,但它800毫秒的读取延迟……

世嘉Mega-CD是为Genesis主机打造的CD-ROM扩展设备,平台累计推出了近200款游戏https://www.youtube.com/watch?v=v-1-5M3M1po,其中不乏佳作,而《Silpheed》绝对是最耀眼的那一个。它凭借精湛的美术设计和惊艳的动画引擎,当时就引得媒体疯狂报道。

或许有人对此不以为然,但请别忘了:这些近乎全屏的过场动画,是在主频仅12.5MHz的m68k处理器上运行的,仅用16色,数据传输速率为150KiB/s。扣除16位16kHz的音频占用后,每秒15帧的视频流,每帧仅能分配到8KiB的存储空间。

过去两周,我利用业余时间逆向解析了《Silpheed》的FMV(全动态视频)格式。这和我以往的工作模式截然不同——全程没写一行代码。下个月我可能会分享自己开发的AI框架并开源,但这次的逆向工作体验着实令人愉悦。

以下是我的研究成果。如果想先熟悉相关内容,看看所有过场动画和游戏背景视频,可以查看我用自研工具制作的分镜脚本(说是“制作”而非“编写”更准确)。

在深入解析《Silpheed》视频格式的优化技巧前,我们得先了解世嘉Genesis与Mega-CD的协同工作机制。

GENESIS │ MEGA-CD
│
┌──────────────────────┐ │ ┌───────────┐ ┌──────────┐
│ MC68000 7.67 MHz │ │ │ WORD RAM │ │ MC68000 │
│ │ ┌───┴──────┐ │ 256 KB │ │ │
│ 64 KB RAM ◄──┤Expansion ├────────►───────────┤ │ 12.5 MHz │
│ │ │ Port │ │PROGRAM RAM│ │ │
│ 8 KB Audio RAM (Z80) │ └───┬──────┘ │ 512 KB │ │ │
└──────────┬───────────┘ │ └─────┬─────┘ └─────┬────┘
│ │ └──────────────┬─────┘
┌─────┴──────────┐ │ │
│ │ │ ┌───────┐ ┌────┴────┐
┌────▼──────┐ ┌─────▼─────┐ │ │ Ricoh │ │ ASIC │
│ VDP │ │ Z-80 │ │ │ PCM ├─────┤ GFX │
│ ┌───────┐ │ │ YM2612 │ │ └───┬───┘ └────┬────┘
│ │64KVRM │ │ │ SN76489 │ │ │ │
│ └───────┘ │ │ │ │ │ │
└─────┬─────┘ └──────┬────┘ │ │ │
│ │ │ │ ┌───────┴──────┐
│ │ ┌──┴──────┐ ┌────▼────┐ │ CD-ROM │
│ └───┤RCA Cable├─────────► MIXER ◄─┤ DRIVE │
│ └──┬──────┘ └────┬────┘ └──────────────┘
│ │ │
┌────▼────┐ │ │
│ TV ◄──────────────────┼─────────────────────┘
└─────────┘ │

加装Mega-CD后,整套设备就变成了两个并行运行的系统。Mega-CD端负责PCM音频与CD播放,直接连接混音器⟦10⟧;还搭载了具备图形加速功能(旋转/缩放等)的ASIC芯片,性能足以对标《马里奥赛车》这类游戏。两个系统通过共享内存(扩展端口)与模拟音频混音实现通信。

了解这套机制后,我对Mega-CD开发者的敬佩更甚以往——这简直是个开发噩梦,尤其是系统同步问题,处理起来难度极高。

Mega-CD系统仍通过三层画面输出到电视:其中两层是由图块构成的背景层(A层和B层),另一层是包含精灵的前景层。

副CPU(m68k)负责绘制背景B的图块与图块映射表;主CPU则负责绘制包含HUD(抬头显示)的背景A层,以及前景精灵层。

副CPU采用双缓冲机制,以L1模式在Word RAM中渲染画面:当一块缓冲被主CPU送入VDP(视频显示处理器)时,副CPU就在另一块缓冲中渲染下一帧。

音频方面,非交互式过场动画仅使用Mega-CD的Ricoh芯片生成PCM级别的音乐;而在交互场景中,Ricoh芯片仅偶尔用于播放PCM音频采样,音乐主要由Genesis的YM2612芯片负责。

初代Genesis(Model 1)的音频链路设计极为复杂:必须用一根“混音线”,将Genesis正面的耳机插孔与Mega-CD背面的RCA输入接口物理连接。Mega-CD会将输入的音频信号与自身的CD-DA(CD数字音频)+PCM信号混音,再通过另一根RCA线直接输出到电视。

多数FMV游戏画质糟糕,是因为开发者采用了“自上而下”的思路——试图用性能孱弱的CPU,把真实电影塞进容量有限的CD-ROM。为此,他们不得不缩小画面尺寸、忍受严重的压缩失真,还得用令人不适的抖动效果。

而Game Arts开发《Silpheed》时反其道而行之,采用了“自下而上”的思路:从硬件的性能限制出发,向上推导设计方案。他们做出了精准的取舍:采用平面着色多边形、仅用16种颜色、放弃高洛德着色、尽可能减少抖动效果。

当然,这一思路能成功,离不开Game Arts团队里才华横溢的美术师——正是他们在有限的条件下(尤其是16色的限制),将视觉效果做到了极致。

同期的PC-CDROM游戏则是另一番景象。得益于性能更强的CPU(如DX4-100),它们能使用更出色的编码技术。一些资金充足的大作,比如《命令与征服》https://www.youtube.com/watch?v=v-1-5M3M1po、《十字军:无悔》https://www.youtube.com/watch?v=rUnvNTvHMnQ、《银河飞将3》https://www.youtube.com/watch?v=uhPlK6yOT3g(足足4张CD!),就借助FMV极大地提升了叙事表现力。

FMV的核心问题本质是带宽问题:数据需从CD-ROM读取,经处理器解压为图像,再输出到屏幕最终显示在电视上。而Mega-CD在这三个环节的表现都不尽人意。

初看之下还有另一个难题:由于没有帧缓冲,渲染必须遵循一套繁琐的流程——先绘制768个8×8像素的图块,再通过图块映射表(Genesis术语中通常称为“名称表”)将这些图块以32×28的布局排列,最终形成256×224像素的画面。

降低带宽最直接的方法是缩小视频尺寸。《Silpheed》也用到了这一技巧,但幅度很小:仅将画面顶部和底部各一行图块设为黑色(共16行)。这反而营造出了电影般的宽屏比例,看起来更像是一种艺术设计。

第二种降低带宽的方法是降低帧率。《Silpheed》主要采用15fps的帧率,复杂场景则会降至7.5fps。

最后一种方法是压缩。在这方面,过场动画与背景视频的处理方式有所不同。

《Silpheed》并未采用帧间差分压缩,视频中的每一帧都是独立完整的——每帧都包含所需的全部图块,以及用于布局的图块映射表。

这么看似乎完全没有压缩,但恰恰是这套繁琐的图块映射系统,为优化提供了巨大空间。以“游戏开始”过场中的第44帧为例:

如果给画面加上8×8像素的网格,就能发现图像的一个特点:大量图块是纯色的。

《Silpheed》的视频格式充分利用了这一点:编码器在一帧中仅存储15种纯色图块各一份,之后在图块映射表中反复引用它们。在这一帧的896个图块中,有456个都引用这15个纯色图块,直接节省了50%的带宽。

剩下的图块则包含多种颜色,针对这些图块,《Silpheed》也有优化技巧。

处理完456个图块后,还剩440个(见下图)。其中一部分图块有个共同特点:仅由两种颜色构成。

Mega-CD的ASIC芯片具备强大的图形处理能力,最知名的就是旋转与缩放功能(足以对标超级任天堂的《马里奥赛车》)。还有一个鲜为人知的功能叫“字体位”⟦11⟧,如其名所示,原本是为了快速渲染双色汉字/文本。通过3字节的数据,字体寄存器可生成16个半字节(即8字节),对应8×8图块的完整两行。具体原理如下:

用3字节生成16个半字节(8字节),相当于在第一轮优化的基础上,又节省了37%的带宽,还省去了CPU用于掩码写入半字节的时间。

上图左侧的234个双色图块,就是通过ASIC的“字体寄存器”生成的;右侧剩下的206个图块,则以8×8“原始”半字节的形式存储在帧数据中。

每帧的图块映射表同样经过压缩。正常情况下,768个图块位置需要占用768×10比特=960字节。压缩方案利用了图像的另一特性:图块映射表中的图块索引呈线性递增(如下方8×2的映射表所示)。

0 1 2 3 4 5 6 7 8 9 A B C D E F

映射表被存储为768比特的位图(96字节),其中0表示“自动递增”,1表示“读取立即值”。实际应用中,这一技巧将存储空间需求降低了近30%(96字节位图+556字节数据=652字节)。

查看分镜脚本就能发现,第一关和第十关包含复杂纹理(开发者在采访中称之为“分形纹理”)。这些画面极难压缩,因此所有图块都采用原始格式存储,没有使用任何优化技巧,只能通过将帧率降至7.5fps来满足带宽要求。

观察实际游戏画面还会发现,激光和爆炸效果并非纯色,而是多彩的。实现这一效果的方法是:在调色板末尾预留4种颜色,由主CPU(m68k)每帧对其进行偏移。

这也意味着,美术师在设计游戏关卡时只能使用12种颜色(过场动画则可使用全部16种颜色,因为其中没有激光效果)!