|
文/核能大狗
导语:这篇文章里提及的很多名词及其原理,对于90后甚至更年轻的读者来说都已经尘封在历史之中了。毕竟,每个时代有每个时代的科技象征,但对于经历过旧时代的玩家而言,再回顾起这些曾经亲切的话题,总会让人有一种回溯历史的复杂情绪。
扫描线
80年代的电视机使用显像管技术,以扫描线显示画面。而当时的游戏机也以扫描线为前提制作,所以要理解当时的游戏画面技术,首先要理解这一机制。
因为显像管及扫描线在现在这个年代已经是灭绝的技术,所以笔者将会比较详细地进行解说。如果是当时玩过红白机的玩家的话应该一定程度上有所知晓。请选择性跳过。
显像管是阴极射线管的一种,广义上是真空管的一种。虽然”真空管”广义上,是在玻璃管中制造真空环境,并在里面通上电极的玻璃管。但如此这般定义的话,白炽灯也会变成真空管。
或许不久的将来,知道白炽灯的原理的人也可能会越来越少。所以借这个地方先说明一次。
白炽灯给灯丝通电,通过让高电阻的灯丝发热来发光。而发热的灯丝会非常快的烧断,所以使玻璃管中真空,阻止灯丝的燃烧(氧化反应)。这时,灯丝上存在因热能,表面形成激发态,而发生热电子,并产生热发射,电子被射出。
在电线附近放置铁板,并使之带上正电荷。于是,拥有负电荷的热电子就会从灯丝飞向带有正电荷的铁板,产生电流。因为热电子只存在于负极,电流的流向会被限制,所以就拥有了整流效果。而拥有这种电气特性的情况下才真正意义上被称为“真空管。”
真空管的灯丝被称作阴极,接受电子的板被称为阳极。这时将阳极的板中间开孔,电子则会穿过阳极,射向远处。这种构造被称作“电子枪”,而射出的电子则称作阴极射线。
严格地讲,开孔的板(plate)应该不叫板(plate),而叫栅格(Grid),如果在Grid的另外一侧放置Plate的话,能得到的不仅是整流,更可以通过调整Grid的电压来改变通向Plate的电流。
约翰·莫齐利和J·Presper·埃克特构思开发的ENIAC即是利用此原理来做开关。
偶尔会将电脑的显示器称作CRT,其实那是阴极射线管(Cathode Ray Tube)的简称。现在显像管已经成了过去的技术,但偶尔也能看到一些过去的影子。Youtube的Tube就是CRT的Tube,也就是说YouTube是“你的电视”的意思。
让我们将话题拉回到显像管上。
真空的玻璃管中,搭载电子枪。电子射线的方向即负电子的流向会受偏转磁石的影响而转向,从而改变其击打的位置。而显像管的表面涂有荧光物质,受到电子的击打后发光。由此产生画面。
偏转磁石分纵向与横向,从左往右高速偏转,而从上往下偏转的速度稍慢。
如上图所示,从红色的点开始从左往右显示一条线的画面。到右端之后沿着蓝色箭头的方向回到左端并向下前进一行(此时没有射出电子所以从画面上无法观察)。
重复如上程序到右下端绿点后,重新回归左上端。这一过程稍微需要一点时间,而这段时间则被称作“垂直空白间隙”,也叫垂直消隐期间。这一概念对于游戏制作来说一个重要的概念。
刨去一些技术性的话题,游戏机的处理速度再快,也需要等待垂直空白间隙结束,才能从缓存中将画面释放出来。所以游戏的处理速度一定程度上会迎合垂直空白间隙。但很多电脑游戏,会因为画面上的物件数量,游戏处理变得不流畅,很多时候是因为电脑无法检测出垂直空白间隙。
当射线从左往右完成一次扫描,这一条线被称作“扫描线”。
在红白机的年代,模拟电视信号的时代,一帧画面由250或300线组成(日本的游戏机皆为NTSC制式,并且接下来要提到的大部分计算机及游戏机都是日本的所以本文以NTSC制式为基准讲解。及单场250线,隔行525线)。
通过调节电子射线的强弱来控制画面亮度的强弱。以适当的时机点亮画面则可以形成图形。将射线分作红、绿、蓝三色的话,即可以形成彩色的画面。
严格地说,并不是有三色的射线,而是有三色的荧光屏蔽,荧光屏蔽上满是空洞。红色的射线会通过其他颜色的屏蔽击打到红色的屏蔽上。
位图
红白机、SG-1000、MSX(微软日本与ASCII合作推出的家用电脑)是没有位图的。但是为了尽可能简单易懂地进行解说,我们对电脑等设备的图形画面(位图)进行说明。
需要一帧图形画面,首先需要一个能记录整幅画面的内存(RAM随机存取存储器,与CPU直接交换数据,和硬盘、手机用的SD卡不是一回事。下文中提到的内存,都会是RAM),记录每一像素点的颜色信息。然后迎合扫描线的速度,将这些信息读取,依照颜色调整设置射线的强弱,以此形成图像。
简单的说,形成一帧画面就是如此。但是这个方法有一个问题,就是需要大量的内存。
举个例子,与红白机同样是1983年发售的电脑PC-8801mkII拥有640x200的分辨率,能显示8色画面。8色即是光的三原色红、绿、蓝三色分别只有开启与关闭两种状态。640x200的分辨率,每种颜色占用1bit的空间,如此计算的话,一种颜色需要16k个字节(一种颜色一个bit,8种颜色信息则需要8bit,8bit为1字节乘以像素数为16000=16k),三种颜色就需要3倍的48k字节。
而与现在1G都嫌少的时代不同,1983年的RAM的价格,16字节大概在300元左右。PC-8801光显存的价格就会超过一台红白机(当时的红白机售价14800日元,按照现在的汇率也需要893元)。
如此高价的游戏机是无法作为一个“玩具”来出售的。
当然PC-8801不仅有显存,还有程序用的64字节主内存。显存依据三原色分作三块,通过访问周围的电子线路来与主存的一部分进行交换。同样的,用同一内存地址对不同类型的内存进行访问的方法被称作“内存库切换”。并且,内存被大致分为两类,DRAM与SRAM,16k字节300元的是DRAM的价格。8801的显存与红白机的RAM同为DRAM,但后期出现在红白机卡带中的电池存档用内存则是SRAM,价格高于DRAM。
像PC-8801表示图形时,每对一个16x16像素的元件进行一次移动,就需要重复进行如下一个流程:
- 描绘一次被元件所遮盖消除的背景,16x16则为256个像素点(耗內存96字节)。
- 在新的位置描绘角色,256像素(耗內存96字节)。
也就是说,每活动一个元件,就需要占用内存192字节。当时的CPU处理速度并不高,依照这个处理方式的话,就需要有非常用非常高超的编程技术来制作游戏。
文字画面
比1983年再早一些,1982年发售的计算机MZ-700之流,为了用更少的内存来显示画面,所以没有图形画面。
MZ-700没有图形画面并不是因为当时的计算机没有图形画面(事实上81年发售的PC-8801已经有图形画面了。)而MZ-700是为了与同样没有图形画面的更早期的计算机保持兼容性才做出了这一的选择。
那怎么办呢。结论就是用文字画面。
在特定的某一字节里输入65这样一个数字,画面里就会显示出A这样一个文字。接下来输入66和67的话,就会出现B和C。(65是A的ASCII值,不过MZ-700没有使用ASCII而是用了原理相同的一种码。为了解释方便这里用ASCII举例)。
文字有8x8的像素组成,也就是仅仅使用1个字节就可以表示出64个像素的元件。作为削减内存使用的方法而言,是非常理想的。
但是如果要让这个元件显示到显像管上就是一件非常麻烦的事情:
- (1)首先,将扫描线除以8,商为n,余为m。文字的高度是8像素,所以就会是显示从上往下的第n行文字的从上往下第m行。
- (2)提取第n行的文字代码,并不是将所有文字提取,而是一个文字一个文字提取。
- (3)读取文字编码的对应“字体信息“(基本上预存在ROM里面,大家所说的字库的由来就是这么一回事情)。
1个文字8字节。假设文字编码是c,c*8地址开始有字体信息。从上往下第m行的字体,就是c*8+m地址开始读取信息。
假设上是一个预存的字体信息。横向一行其实是8bit即1字节。一个字需要8个字节去显示。如果m为0,则从红色的点开始读取数据。如果m为1或者2或者3,即使是读取同一个字体信息,从绿点开始或是从蓝点开始,或是从黄点开始读取,读取出的内容会不同。
- (4)显示横向8个像素的数据。取出的数据是1字节,有8bit。将这个输出到画面上,就是8个像素点。
- (5)返回⑵的步骤,处理下一个文字。直到改行结束。
- (6)返回⑴的步骤处理下一行扫描线。直到这帧画面结束(即完成最下方扫描线的处理。)
实际上将数据输出到扫描线的步骤只有⑷,但⑷的前期准备⑵⑶需要非常复杂的处理。而扫描线不等人,真的使用这样的方法进行处理的话,根本赶不上扫描线的速度。
有问题就有对策。
在扫描线之前实现准备好显示文字用的数据,再将这个数据交给扫描线。
在现在要输出的数据被用得屎干尿尽之前,先准备接下来的数据,时间上就会有所充裕。
通常字体信息存放在ROM,不可擦写。之后也会详细提到。红白机就是利用类似原理来制作画面。
红白机的文字画面(红白机所说的背景画面)从原理上就是以8个像素点为一个单位来安放元件,而且也只能这样安放元件。所以它被用来作为背景画面,而在背景之上活动的元件(马力欧、林克)之类的,是用精灵图来描绘。
一个题外话,不管是PC-8801还是MZ-700,都可以给文字画面的文字上色。虽然字库里的数据是黑白的,但是在输出时可以以一个文字为单位给文字上色。刚才在图形画面里提到的PC-8801也拥有文字画面。而且,可以将文字画面和图形画面重叠。当时的主流是文字画面和图形画面切换使用,所以重叠是非常牛逼的事情。
再往远一点讲富士通82年发售的FM-7没有搭载文字画面,全部统一为图形画面。但当时的CPU将文字处理为图形的速度非常低下,所以FM-7是搭载了主CPU及图形用CPU,两个CPU的奢华机器。而MSX可以在字库阶段上色,但是在输出时无法变更,所以根据模式的不同,文字可以是黑白,也可以是彩色。
红白机类似于字库的东西也不是黑白的,在输出时也可以变更颜色。但是无法以一个文字为单位上色。文字画面也是各种各样。
PCG
用文字画面的原理,而字体数据变成RAM会怎样呢?MSX和SG-1000就是用了这样一个结构来产生画面。
倒不如说,这两个机器用的是同一个LSI(大规模集成电路),当时非常流行的德州电器产的TMS9918。接下来两个机器统一叫MSX,因为比较省事。
回到正题,MSX的字体数据是在RAM上的。因此可以通过CPU的处理来改变字体数据的内容,比如将文字换成游戏中使用的话。
这样一来,可以用少量的RAM空间,就可以快速的描绘出一幅画面。这种原理,我们就叫做Programmable Character Generator(可变更的小图像制作引擎),简称PCG。
这个方法来源于“文字数据”所以图像是黑白的。不过MSX可以将每8个文字分作32组,对文字的颜色及其背景色进行指定。于是可以绘制出,带了一点颜色的画面。MSX的PCG真正的实力,应该是被称为“图形模式”的画面模式。
之后也会提到。图形模式是可以给横向每8个像素点指定两种颜色。文字元件的纵向有8个像素点,所以理论上一个元件可以使用16种颜色。
精灵图
精灵图(Spirit)指包含于场景中的二维图像或动画,比如玩家操控的角色、怪物等等,在计算机图形学中,当一张二维图像集成进场景中,成为整个显示图像的一部分时,这张图就称为精灵图。
无论是红白机还是MSX还是SG-1000,没有这个的话是无法制作游戏的。那就是精灵图的描绘方法。查询搭载在MSX和SG-1000上的图像处理器TMS9918的参数就可以知道,早期的精灵图的绘制方法简单暴力。
首先准备足够精灵图用的显示线路,再将输出端接到优先解码器上,在输出的时候在背景输出的同时,优先解码器会将精灵图复写在背景层上。即使如此,对精灵图的处理依旧会有上限,所以在处理同一扫面线中出现多枚精灵图时大家就能看到精灵图出现闪烁的情况。
红白机实际上有8x8和8x16两种精灵图,输出上限是8枚。
简单地说,精灵图输出的流程如下:
1.将背景输出到缓存。
2.根据坐标,将精灵图通过优先解码器输出。
因此精灵图可以独立于背景活动。
不知道各位是否还记得文章最初的时候介绍的仅有图形画面是活动一个元件的方法。如果用那种方法的话,每一次运动都需要占用192字节的内存。而且这还是不考虑透明色等特殊情况的值。精灵图则只需要修改2字节的坐标信息就可以完成这一目标。而且还能有透明的部分能看到背景和其他的精灵图。
这对于红白机和MSX以及SG-1000而言是做游戏时最重要的法宝。
存留在现代的影子
基本的技术到这里已经解释完了。放眼回到现代。
现在模拟广播信号很大程度上已经在衰退。在模拟信号的时代,扫描线由广播信号直接进行控制。但数字广播的时代就不同了。广播的电波信号被压缩成影像数据,进入计算机然后被解码,再被输出到画面上。
不过中国目前还没有到如此的地步。相当一部分的地区,数字广播信号在被传送到省市的接收站之后还是会被转换成隔行扫描576线的标清信号。又或是被垃圾电视盒转换成模拟信号继续扫描线的老一套,然后又被数字信号的液晶电视被转换成数字信号,还附上扫描线的锯齿。央视的1080 50i高清信号基本上是被浪费的。
当下,显像管基本上都进了垃圾场。时代已经交给了液晶、负离子电视、有机EL。而高清的出自信号也已经没有扫描线的概念,扫描线也已经和显像管一起进了垃圾场。
但是,扫描线也没有完全进垃圾场。液晶之类的显示设备也并不是一次性将画面的全部数据读取并突然表示。虽然没有电子射线,但是从画面的顶点开始读取数据,并以像素为单位依次表示,这点依旧和显像管有相似之处。虽然没有偏转磁石之类的结构。但依旧会有垂直空白间隙。
计算机的话虽然已经没有文字画面和PCG,内存也变得便宜了。所以也不需要再去使用那些复杂的结构。
精灵图也已经濒临绝种。现在的计算机与游戏机都有3D图形功能。
首先制作元件,然后指定元件的坐标之后,连3D转换都会随着现代化的硬件和引擎瞬间搞定。虽然不需要CPU对画面一点一点地进行调整,但也可以算是一种精灵图的进化。精灵图不是消失,而是有了更好的泛用性,甚至被用在文字描绘上。
80年代的精灵图用扫描线缓存来进行描绘,以一行扫描线的时间进行处理。因此横向能够并列的精灵图的数量有所限制。3D处理时,画面由帧缓存生成,一次处理一整幅的画面。与扫描线缓存相比,有更充裕的时间进行处理,也可以进行更复杂的处理。
结语
上面说的这些,都是曾经在技术极度有限、实现手段非常不发达的情况下,让人们找到乐趣与想象力的技术焦点。只不过科技的进步是客观的,它们终究还是走进了历史的封印之中。如果你也是一位30年的老玩家的话,也可以回顾一下自己几十年的游戏生涯,或许会有什么有趣的发现。
来源:机核网
原地址:https://www.g-cores.com/articles/102762
|
|