FC 游戏机的工作原理是怎样的?王澍的回答

 

原文:FC 游戏机的工作原理是怎样的? - 王澍的回答 - 知乎 https://www.zhihu.com/question/20651716/answer/60461291

 

扼要的写一下显示部分的技术原理,尤其是设计缘由和精妙之处,尽量使外行人也能看懂:

(一开始是预备知识,我至少假设读者理解二进制,二进制位bit,字节byte,十六进制表示等)
显示的基本单元是像素(Pixel),我们看到的几乎所有显示器显示的东西都是许多像素组成的,可以把它们想象成一个个小方格,整齐的排列在显示器上:
FC 游戏机的工作原理是怎样的?王澍的回答

比如这幅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存储调色板*。

Sprite,常译作精灵。。。 指包含于场景中的二维图像或动画,NES里基本就是会动的各种角色了,比如Super Mario里玛里奥自己,各种怪什么的。
* 调色板 Palette , 通俗的讲就是颜色编码表。NES的Palette见下图(中文维基上说48种彩色+5种灰阶是错的。。。只有4种灰阶,整个右边三列的色彩RGB表示都是 [0,0,0],编码20和30的都是 [255,255,255]):

FC 游戏机的工作原理是怎样的?王澍的回答

 

按照今天的显示技术来看,FC的彩色技术简直就是奇技淫巧大集合。只有2KB的显存和2KB的主存,基本完全无可能装下彩色图像。
 

FC 游戏机的工作原理是怎样的?王澍的回答

(NES PPU)

做一个简单计算:

分辨率256x240 = 61440,即画面上有这么多个像素点。(忽略NTSC系统损失的16行,PAL系统上是256x240)

我们如果只显示黑白,即每个像素非黑即白,那么单像素一个bit就可以了,这么大的分辨率下,一共需要1 * 61440 / 8 / 1024 = 7.5KB,要是直接这么干黑白点都装不下主机显存,当时好点的电脑勉强差不多。
假设我们用现在非常普通的256色,即8个二进制位,一个字节存储,整个画面61440 / 1024 = 60KB,这在FC时代是任何普通机器都不能直接做到的。

为了显示彩色,当时的不同机器有各种技术手段,可以说八仙过海各显神通。FC用的第一种手段叫做Color Cell,具体来说:

  1. 将整个图像分割成许多8x8的小cell (或者叫tile)
  2. 每个cell内至多有4种颜色

这样,每个像素只用2bit来存储色彩,然后对一共 32x30 = 960 个cell再分配色彩编码,指示有哪几种颜色。

 

举个栗子,我们熟悉的恶魔城 (Castlevania, 1986) 开场:(图片来自[dustmop.io blog]

FC 游戏机的工作原理是怎样的?王澍的回答

图中最小的格子(所有明暗线分割出的)即一个cell或tile,四个tile组成一个block(仅亮线分割出的)。图中一共用了10种颜色。你绝对找不出用了超过4种颜色的cell。

再看一个我顶我顶:

FC 游戏机的工作原理是怎样的?王澍的回答

编码后的cell表将存储在显存所谓name table区域中,刚才的恶魔城开场的区域编码成形如下图所示:

FC 游戏机的工作原理是怎样的?王澍的回答

FC第二个高明的地方在于领先时代的滚屏技术,由于PPU内部有两个(镜像后是四个)name table来存储cell表信息,我们可以一直预先存储着超过显示部分的内容,在玩家或者程序触发滚屏操作后,通过向两个寄存器PPUSCROLL和PPUCTRL写相关信息,即可移动游戏镜头。

 

在FC之前的主机,滚屏操作几乎都要覆写整块屏幕,代价高昂。FC的出现同时使得动作、射击型游戏得到极大发展。

 

最后一个部分是游戏中运动的Sprite,存储于显卡的特定内置存储区域,通常单个大小为8x8或8x16,我们看到的主角们大都是多个Sprite拼到一起的,比如Mario实际上是4个Sprite拼出来的,只是在程序中保证不会散架。

 

Sprite的显示是覆盖背景的,无论背景如何设置,在PPU进行Sprite探测后都会将对应位设置成Sprite的色彩。


最后,btw,基本上所有的FC/NES开发资料都能在NES dev和其附属wiki上找到,只是没有相关专业知识可能比较难啃。
国人的《任天堂游戏编程探秘》一书总的来说还是比较详细的,然而很多关键之处却语焉不详,且花了很多篇幅教怎么写代码。对于外行来说还好,对于专业人士就基本无用了。更重要的是,这本书几乎没有讲任何Rationale的东西,对于真正的学习是灾难性的。