Silpheed 的艺术与工程

Lobsters Hottest 新闻

摘要

对世嘉CD游戏 Silpheed 中使用的 FMV 压缩和播放技术的深入技术分析,包括对其格式的逆向工程。

<p><a href="https://lobste.rs/s/yohvez/art_engineering_silpheed">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/06/01 22:36

# Silpheed 的艺术与工程 来源:https://fabiensanglard.net/silpheed/ 2026 年 6 月 1 日 # Silpheed 的艺术与工程 --- [](https://fabiensanglard.net/silpheed/f384_cropped.png)90 年代是视频游戏机世界取得巨大进步的十年[\[1\]](https://fabiensanglard.net/silpheed/#footnote_1)。每一款新机型都带来了更强的处理能力和更好的图形效果,毫无妥协。 然而,90 年代中期 CD-ROM 驱动器的出现却有些异类。虽然 640 MiB 的存储容量是卡带容量的 320 倍[\[2\]](https://fabiensanglard.net/silpheed/#footnote_2),但访问时间(800ms[\[3\]](https://fabiensanglard.net/silpheed/#footnote_3))和带宽(单速 150 KiB/s)分别慢得令人咋舌,相差 4,000,000 倍和 35 倍。 Mega-CD 是世嘉为其 Genesis 主机引入 CD-ROM 的想法。该平台大约推出了 200 款[\[4\]](https://fabiensanglard.net/silpheed/#footnote_4)游戏。一些优秀作品如《Sonic CD》(https://www.youtube.com/watch?v=yKpS3ja7m7w)、《Snatcher》(https://www.youtube.com/watch?v=sVVS2E3dwXg)、《Final Fight CD》(https://www.youtube.com/watch?v=T8cBEOqLf1o) 和 RPG 游戏(https://www.youtube.com/watch?v=xeq9fPOxz6o)问世。但大量依赖全动态视频(FMV)的游戏让世嘉的这款附加模块声名狼藉(《Night Trap》(https://www.youtube.com/watch?v=plV5l_uKzDo)、《Prize Fighter》(https://www.youtube.com/watch?v=FPcnTpqjX6M)、《Slam City》(https://www.youtube.com/watch?v=Mjv0t0OMCBw)、《Corpse Killer》(https://www.youtube.com/watch?v=e0JgUvRPAac)、《Supreme Warrior》(https://www.youtube.com/watch?v=Lyak7VQhW4o)、《WireHead》(https://www.youtube.com/watch?v=h7IXEJci_OQ&t=380s) 和《A/X-101》(https://www.youtube.com/watch?v=lM9ukMOe7PU))。 然后,还有 ***Silpheed***。凭借精致的艺术品味和能够呈现惊人动画的引擎,它让媒体为之疯狂[\[5\]](https://fabiensanglard.net/silpheed/#footnote_5)[\[6\]](https://fabiensanglard.net/silpheed/#footnote_6)。玩家们猜测哪些是实时 3D,哪些是预计算内容[\[7\]](https://fabiensanglard.net/silpheed/#footnote_7)。它获得了至今仍为人称道的赞誉[\[8\]](https://fabiensanglard.net/silpheed/#footnote_8)[\[9\]](https://fabiensanglard.net/silpheed/#footnote_9)。 对于那些仍不为所动的人,请记住这些近乎全屏的过场动画运行在 12.5MHz 的 m68k CPU 上,使用 16 种颜色,消耗 150 KiB/s。在 16 位 16kHz 音乐的情况下,15fps 的视频流每帧仅剩下 8 KiB。 过去两周,我利用业余时间逆向工程了这个 FMV 格式。这与我通常的工作方式不同,因为我一行代码都没写。我可能下个月会写一些关于我的 A.I 框架(并开源)的内容。但我已经可以说这是一种非常愉快的整体工作方式。 以下是我的成果。如果你想观看所有过场动画和游戏背景视频以熟悉主题,这里是我用自己设计的工具创建的分镜表(storyboard)(https://fabiensanglard.net/silpheed/storyboard)(我不能说是我“写”了这些工具)。 # Sega-CD 内部原理 101 --- 在深入探讨使 Silpheed 视频格式如此高效的优化和技巧之前,我们需要了解 Sega 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\]](https://fabiensanglard.net/silpheed/#footnote_10)。还有一个带有图形加速功能(旋转/缩放/杂项)的 ASIC,可与《马里奥赛车》等游戏媲美。两个系统通过共享内存(扩展端口)和模拟音频混合进行通信。 了解这东西的工作原理让我更加敬佩 Mega-CD 的开发者。处理起来简直是噩梦,尤其是同步问题。 # Silpheed 的架构 --- [](https://fabiensanglard.net/silpheed/arch_all.png)一个 Mega-CD 系统仍然通过三层绘制到电视上。其中两层由瓦片组成,称为背景(A 和 B),而一层是包含精灵的前景。 子 CPU m68k 写入背景 B 的瓦片和瓦片地图。同时,主 CPU 负责“绘制”包含 HUD 的背景 A 和前景精灵层。 子 CPU 使用双缓冲系统,在 L1 模式下渲染到 Word RAM。当一个缓冲由主 CPU 提供给 VDP 时,它渲染下一帧到另一个缓冲。 在音频方面,非交互式过场动画仅依靠 Mega-CD 的 Ricoh 产生 PCM 品质的音乐。在交互序列中,Ricoh 偶尔用于 PCM 音频样本,而音乐则通过 YM2612 完成。 原始 Genesis(型号 1)的音频路径非常复杂。Genesis 的输出(其前面板插孔)必须通过“混音线”物理连接到 Sega-CD 背面的 RCA 输入。然后 Sega-CD 将线路输入信号与其自身的 CD-DA + PCM 信号混合。结果通过另一根 RCA 电缆直接发送到电视! # 优秀的设计决策 --- [](https://fabiensanglard.net/silpheed/f549_cropped.png)大多数 FMV 游戏看起来很差,因为开发者采用自上而下的方法,试图用弱小的 CPU 将真正的电影塞进小小的 CD-ROM。为此,他们不得不使用极小的窗口、压缩伪影和令人流泪的抖动。 对于 Silpheed,Game Arts 采取了相反的方法。他们从底层开始,从系统的限制出发向上设计。他们做出了优秀的权衡决策:使用平面着色多边形、总共 16 种颜色、无高洛德着色、最小化抖动。 如果没有 Game Arts 才华横溢的艺术家们,这种方法永远不可能成功,他们能够凭借这些选择(尤其是有限的颜色数量)走得很远。 PC-CDROM 游戏则是另一回事。得益于更好的 CPU(DX4-100),它们能够使用更好的编解码器。一些资金充裕的游戏,如《命令与征服》(https://www.youtube.com/watch?v=v-1-5M3M1po)、《谍影重重:无悔》(https://www.youtube.com/watch?v=rUnvNTvHMnQ) 或《银河飞将 III》(https://www.youtube.com/watch?v=uhPlK6yOT3g)(4 张 CD!),使用 FMV 极大地改善了叙事。 # 带宽问题 --- FMV 的核心问题是带宽问题。数据需要从 CD-ROM 中提取,由处理器解压成图像,然后该图像必须馈送到视频屏幕才能到达电视。Mega-CD 在这三个阶段都不太胜任。 # 瓦片地图问题 --- 乍一看,还有另一个问题。没有帧缓冲,渲染必须遵循一个繁琐的过程:绘制 768 个 8x8 尺寸的瓦片。然后通过瓦片地图(在 Genesis 术语中传统上称为“名称表”)将这些瓦片以 32x28 的方式排列在屏幕上。结果形成 256x224 的图像。 # 减少带宽的三种简单方法 --- [](https://fabiensanglard.net/silpheed/f847_cropped.png)减少带宽最简单的方法是减小视频尺寸。Silpheed 也使用了这个技巧,但只是稍微用了一下:顶部和底部的瓦片行设置为黑色(总共 16 行)。这几乎看起来像艺术选择,因为它产生了电影般的宽高比! 减少带宽的第二种方法是降低帧率。Silpheed 主要使用 15fps,一些复杂场景低至 7.5fps。 最后,减少带宽的第三种方法是压缩。为此,过场动画和背景视频处理方式不同。 # 视频压缩 --- Silpheed 不使用增量压缩。视频中的每一帧都是自包含的。每一帧都包含它所需的所有瓦片以及将这些瓦片放置在屏幕上的瓦片地图。 这样描述,看起来根本没有压缩。但这正是繁琐的瓦片地图系统成为巨大优化源泉的地方。我们以“游戏开始”过场动画中的第 44 帧为例。 [](https://fabiensanglard.net/silpheed/8x8/f044.png)如果我们添加一个 8x8 像素的网格,我们可以看到图像具有有趣的特性。例如,很多瓦片都是相同的纯色。 [](https://fabiensanglard.net/silpheed/8x8/f044_grid.png)Silpheed 的视频格式广泛利用了这一点。编码器在帧中只发出每种 15 种纯色瓦片的一个实例,然后在瓦片地图中反复引用它。对于这一帧,在 896 个瓦片中,456 个引用了相同的 15 个单色瓦片。这立即减少了 50% 的带宽。 [](https://fabiensanglard.net/silpheed/8x8/f044_solid_tiles_grid.png)[](https://fabiensanglard.net/silpheed/8x8/f044_nonsolid_tiles_grid.png)右边是所有剩余的由多于一种颜色组成的瓦片。对于这些,Silpheed 也有妙招。 # 利用 Mega-CD ASIC 进行解压 --- 处理了 456 个瓦片后,还剩 440 个(见下图)。其中一些瓦片也有有趣的属性。它们仅由两种颜色组成。 [](https://fabiensanglard.net/silpheed/8x8/f044_nonsolid_tiles_grid.png)Mega-CD ASIC 具有高级图形能力。最著名的是旋转和缩放(以便与超级任天堂的《马里奥赛车》等游戏竞争)。一个不那么知名的特性称为“字体位”[\[11\]](https://fabiensanglard.net/silpheed/#footnote_11)。正如其名,它旨在允许快速的双色汉字/文本渲染。通过三个字节,字体寄存器生成 16 个半字节(8 字节),这正好是一个 8x8 瓦片的两整行。工作原理如下: 1. 将两个 4 位调色板索引写入源颜色寄存器 ($FF804D)。 - 颜色 A = 当位为 0 时生成的像素 - 颜色 B = 当位为 1 时生成的像素 2. 将一个 16 位位图模式写入 $FF804E。 - 每个位代表一个像素。 - 16 位被解释为两行,每行 8 个像素。 - 0 位选择颜色 A。 - 1 位选择颜色 B。 3. ASIC 将 1 位模式扩展为 4 位像素数据。 4. 从 $FF8050-$FF8056 读取生成的瓦片数据。 通过三个字节,字体寄存器生成 16 个半字节(8 字节)。这比第一次优化后剩余的 50% 又节省了 37% 的带宽。更不用说节省的 CPU 时间,因为不再需要进行掩码操作来写入半字节。 [](https://fabiensanglard.net/silpheed/8x8/f044_nonsolid_tiles_asic_grid.png)[](https://fabiensanglard.net/silpheed/8x8/f044_nonsolid_tiles_raw_grid.png)上面左边是 234 个由两种颜色组成的瓦片。这些是通过 ASIC “字体寄存器”生成的。右边是剩下的 206 个原始瓦片,它们实际上以 8x8 “原始”半字节形式存储在帧中。 # 瓦片地图压缩 --- 每一帧都有一个瓦片地图,这也是压缩的。通常 768 个瓦片位置需要 768x10 位 = 960 字节。压缩方案利用了图像的另一个属性,即瓦片地图中的瓦片索引线性递增(如下面的 8x2 瓦片地图所示)。 `` 0 1 2 3 4 5 6 7 8 9 A B C D E F `` 瓦片地图存储为 768 位的位图(96 字节),其中 0 表示“自动递增”,1 表示读取一个立即值。实际上,这个技巧将空间需求减少了近 30%(96 + 556 字节有效负载 = 652 字节)。 # 分形关卡 --- 如果你参考分镜表(storyboard)(https://fabiensanglard.net/silpheed/storyboard),你会发现有两个关卡(第 1 关和第 10 关)包含复杂的纹理(在采访中被开发者称为“分形”)。这些序列非常难以压缩。以至于所有瓦片都使用原始格式,没有任何技巧。唯一使其工作的办法是将帧率降至 7.5fps。 # 调色板技巧 --- [](https://fabiensanglard.net/silpheed/laser_palette_cycle.png)如果你看看实际游戏画面(https://youtu.be/GBS332N6wig?si=NGvRQkOj1b3aaXOi&t=1749),你会注意到激光和爆炸并没有使用纯色。它们实际上是多色的。这种效果通过在调色板末尾保留四种颜色,并通过主 m68k 每帧循环移位来实现。 这也意味着艺术家们不得不用仅有十二种颜色来设计游戏序列(过场动画使用完整的 16 种颜色,因为其中没有激光效果)! # 参考文献 --- ^ (https://fabiensanglard.net/silpheed/#back_1)[ 1]90 年代的游戏主机 (https://fabiensanglard.net/silpheed/consoles.webp) ^ (https://fabiensanglard.net/silpheed/#back_2)[ 2]维基百科:Mega-CD (https://en.wikipedia.org/wiki/Sega_CD) ^ (https://fabiensanglard.net/silpheed/#back_3)[ 3]VG Museum,Sega-CD (https://www.vgmuseum.com/systems/segacd/) ^ (https://fabiensanglard.net/silpheed/#back_4)[ 4]Mega-CD 游戏列表 (https://segaretro.org/List_of_Mega-CD_games_in_the_United_States) ^ (https://fabiensanglard.net/silpheed/#back_5)[ 5]Silpheed/反响 (https://segaretro.org/Silpheed/Reception) ^ (https://fabiensanglard.net/silpheed/#back_6)[ 6]Silpheed.com 杂志文章 (https://web.archive.org/web/20120915035000/http://www.silpheed.org/) ^ (https://fabiensanglard.net/silpheed/#back_7)[ 7]Silpheed 背景与过场动画 (https://gendev.spritesmind.net/forum/viewtopic.php?t=224) ^ (https://fabiensanglard.net/silpheed/#back_8)[ 8]为什么 Silpheed 的 FMV 看起来这么好?(https://www.reddit.com/r/SegaCD/comments/1raev90/why_does_silpheeds_fmv_look_so_good/) ^ (https://fabiensanglard.net/silpheed/#back_9)[ 9]Sega CD Silpheed 很大程度上只是噱头,但这没关系 (https://www.reddit.com/r/SegaCD/comments/jw8e0e/sega_cd_silpheed_was_largely_just_spectacle_but/) ^ (https://fabiensanglard.net/silpheed/#back_10)[10]Mega-CD V1 手册 (https://archive.org/details/sega-cd-users-manual) ^ (https://fabiensanglard.net/silpheed/#back_11)[11]MEGA-CD 软件开发手册 (https://segaretro.org/images/archive/6/6f)

相似文章

超级任天堂卡带内部揭秘

Fabien Sanglard

对超级任天堂卡带的详细技术分析,涵盖 CIC 复制保护、ROM 容量分布、带电池备份的 SRAM 以及 Super FX 等增强处理器。

剖析超级任天堂视频系统

Fabien Sanglard

从任天堂工程师的视角,详细探讨超级任天堂的视频系统设计,解释CRT技术与工程选择。

Fisher-Price Pixter 的完整保存

Lobsters Hottest

详细记录了 Fisher-Price Pixter 设备及其游戏的首次完整逆向工程、文档化和模拟过程,涵盖了硬件分析、ROM 转储以及软件模拟。

Soul Player C64 – 在 1 MHz Commodore 64 上运行的真正 Transformer

Hacker News Top

# gizmo64k/soulplayer-c64 来源:[https://github.com/gizmo64k/soulplayer-c64](https://github.com/gizmo64k/soulplayer-c64) # Soul Player C64 **一款在 1 MHz Commodore 64 上运行的真实 Transformer。** ``` .-------. | O O | | V | |..|---|..| # SOUL PLAYER C64 2.5万个参数。 2 层网络。 真实的 Transformer。 从软盘加载运行。 你> 嗨 C64> 你好!这声音不错。真神奇! ``` 一个 2 层仅解码器(Decoder-Only)Transformer —— 与 ChatGPT、Claude 和 Gemini 背后的架构相同 —— 采用手写 6502/