小时候那种插卡玩的游戏机,原来是这么呈现出来的
FC 游戏机的工作原理是怎样的?
王澍,Force wielder and halfelf ranger
扼要的写一下显示部分的技术原理,尤其是设计缘由和精妙之处,尽量使外行人也能看懂:
(一开始是预备知识,我至少假设读者理解二进制,二进制位 bit,字节 byte,十六进制表示等)
显示的基本单元是像素(Pixel),我们看到的几乎所有显示器显示的东西都是许多像素组成的,可以把它们想象成一个个小方格,整齐的排列在显示器上:
比如这幅 Lena 局部经过放大后,可以看出每个像素就是显示一个色彩的方块。当今我们常见的显示调色有 256 色,或者真彩(True color)24 位色。 所谓 256 色就是一个字节存储 256 种颜色,而真彩色是三个通道从暗到明各 256 色,然后三原色组合在一起。我们需要 3x8 个二进制位来表示。三原色共 3*8 bit
FC/NES 的主要硬件包括一颗 MOS Technology 6502 芯片,以及被称作 PPU (Picture Processing Unit) 的图形处理芯片 RP2C02/RP2C07。PPU 有 2KB 的外部 RAM 来存储显示图像和其它辅助信息,256 字节的内部 DRAM 存储 sprite*,32 字节的内部 SRAM 存储调色板 *。
* ,常译作精灵。。。 指包含于场景中的二维图像或动画,NES 里基本就是会动的各种角色了,比如 Super Mario 里玛里奥自己,各种怪什么的。* 调色板
, 通俗的讲就是颜色编码表。NES 的 Palette 见下图(中文维基上说 48 种彩色+5 种灰阶是错的。。。只有 4 种灰阶,整个右边三列的色彩 RGB 表示都是 [0,0,0],编码 20 和 30 的都是 [255,255,255]):
按照今天的显示技术来看,FC 的彩色技术简直就是奇技淫巧大集合。只有 2KB 的显存和 2KB 的主存,基本完全无可能装下彩色图像。
做一个简单计算:
分辨率 256x240 = 61440,即画面上有这么多个像素点。(忽略 NTSC 系统损失的 16 行,PAL 系统上是 256x240)
我们如果只显示黑白,即每个像素非黑即白,那么单像素一个 bit 就可以了,这么大的分辨率下,一共需要 1 * 61440 / 8 / 1024 = 7.5KB,要是直接这么干黑白点都装不下主机显存,当时好点的电脑勉强差不多。
假设我们用现在非常普通的 256 色,即 8 个二进制位,一个字节存储,整个画面 61440 / 1024 = 60KB,这在 FC 时代是任何普通机器都不能直接做到的。
为了显示彩色,当时的不同机器有各种技术手段,可以说八仙过海各显神通。FC 用的第一种手段叫做 Color Cell,具体来说:
将整个图像分割成许多 8x8 的小 cell (或者叫 tile)
每个 cell 内至多有 4 种颜色
这样,每个像素只用 2bit 来存储色彩,然后对一共 32x30 = 960 个 cell 再分配色彩编码,指示有哪几种颜色。
举个栗子,我们熟悉的恶魔城 (Castlevania, 1986) 开场:(图片来自)
图中最小的格子(所有明暗线分割出的)即一个 cell 或 tile,四个 tile 组成一个 block(仅亮线分割出的)。图中一共用了 10 种颜色。你绝对找不出用了超过 4 种颜色的 cell。
再看一个我顶我顶:
编码后的 cell 表将存储在显存所谓 name table 区域中,刚才的恶魔城开场的区域编码成形如下图所示:
FC 第二个高明的地方在于领先时代的滚屏技术,由于 PPU 内部有两个(镜像后是四个)name table 来存储 cell 表信息,我们可以一直预先存储着超过显示部分的内容,在玩家或者程序触发滚屏操作后,通过向两个寄存器 PPUSCROLL 和 PPUCTRL 写相关信息,即可移动游戏镜头。
在 FC 之前的主机,滚屏操作几乎都要覆写整块屏幕,代价高昂。FC 的出现同时使得动作、射击型游戏得到极大发展。
最后一个部分是游戏中运动的 Sprite,存储于显卡的特定内置存储区域,通常单个大小为 8x8 或 8x16,我们看到的主角们大都是多个 Sprite 拼到一起的,比如 Mario 实际上是 4 个 Sprite 拼出来的,只是在程序中保证不会散架。
Sprite 的显示是覆盖背景的,无论背景如何设置,在 PPU 进行 Sprite 探测后都会将对应位设置成 Sprite 的色彩。
最后,btw,基本上所有的 FC/NES 开发资料都能在和其附属 wiki 上找到,只是没有相关专业知识可能比较难啃。
国人的《任天堂游戏编程探秘》一书总的来说还是比较详细的,然而很多关键之处却语焉不详,且花了很多篇幅教怎么写代码。对于外行来说还好,对于专业人士就基本无用了。更重要的是,这本书几乎没有讲任何 Rationale 的东西,对于真正的学习是灾难性的。
客官,这篇文章有意思吗?