您现在的位置:主页 > 少年德育 >
 
 

FC游戏机的工作原理是怎样的

时间:2020-05-17 14:18:25

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