为了节省内存,任天堂对超级玛丽使用了哪些逆天的技巧?

观点
2022
09/16
16:42
亚设网
分享

FC(Family Computer)诞生于 1983 年,90 年代开始在中国大面积流行。想必 FC(NES / 红白机 / 小霸王)是各位 80 后、90 后大叔的童年回忆。还记得那个火热的夏天,刚放学的我们,约上几个小伙伴,围坐在电视机前,双打魂斗罗的场景吗?FC 上诞生了太多太多经典的游戏,《魂斗罗》《超级马里奥兄弟》《双截龙》《坦克大战》《雪人兄弟》...... 陪我们度过童年美好的时光。

大家一定很想知道 FC 是如何用孱弱的机能实现精美的游戏画面的吧。(好吧,大家其实并不想)。

在这里我就简单介绍一下 FC 的显示技术,顺便带大家找寻童年的记忆。绝不采用生涩难懂的专业术语,力求以最轻松的方式向大家科普,我的目标是,让我奶奶也看得懂。

FC 游戏最重要的组成部分是:角色与背景

没错,正如大家所选的,一款游戏最重要的组成部分就是角色与背景

人类历史上第一款家用主机 奥德赛(Odyssey)

《战神 4》游戏

两个游戏都是由背景和角色构成。

最老和最新,两者隔了 46 年,在这 46 年的岁月里游戏画面的基本组成元素从未改变过。

我们就以这两方面入手,说说 FC 游戏的画面技术吧。

文章分为 5 个章节。

1.背景

2.角色

3.水平切割

4.命名表

5.某些游戏运用的奇技淫巧

(1)背景

背景,顾名思义,就是游戏人物活动的场景。没有背景,只有黑漆漆的一片,这游戏还怎么玩?

FC 的分辨率很低,只有区区 256x224,什么概念呢,我们的“真 4K”游戏机 ps4 pro 的分辨率是 FC 的 145 倍,换句话说,ps4 pro 能装下 145 个 FC 画面。

FC 的背景绘制存在极大的限制,毕竟是 1983 年的硬件,当年的程序猿和美工狮是在如此恶劣的环境中开发游戏。

这个场景大家肯定再熟悉不过(为了突出背景,去掉了人物)。玩过 FC 的人不可能没玩过这个游戏。没错,这个游戏就是大名鼎鼎的《魂斗罗》,又名《双截龙》,俗称《坦克大战》,诨名《沙罗曼蛇》......

大家猜猜,绘制这个背景使用了多大的内存?

这个截图以 png 格式保存,大小为 2.43KB。然而,FC 的显存只有 2KB。所以,用现代的方法连一个最简单的场景都做不出来。

聪明的程序猿用一个很聪明的方法完成了这个“Mission: Impossible”。

大家仔细观察一下这个背景,有没有发现,地板和砖块都是用方块拼出来的?

对了,就是用方块(tile)拼!

加上网格就很直白了,大家都看出来了吧,FC 游戏的背景就是用一个个方块拼出来的。

每个网格就是一个方块,方块是 8x8 像素,横着数 32 个方块,竖着数 28 个方块,总共 32x28=896 个方块。

这些方块都是大量地重复使用。

FC 游戏里有个拼图库(个人翻译,专业术语叫 CHR)。

如下图所示:

里面一个有 16x16=256 个方块。

大家仔细找找,这个场景里的所有方块都能在拼图库里找到。库里甚至还能找到一些奇奇怪怪的东西,那是之后的场景素材。

比如说这个问号,就是由 4 个方块组成。

库里每个方块都有自己的索引,简单说就是编号。

如果想用一个方块,直接从拼图库里按编号找就行了。

所以,FC 游戏的画风其实是这样的:

(逼死密集恐惧症)

大家还能脑补出游戏原来的样子吗?

整个屏幕被分成 32x28 个方块,每个方块包含一个编号,根据编号找到拼图库里对应的拼图,然后显示出来。

大家注意到没有,屏幕一共有 32x28 个方块,拼图库一共有 16x16 个方块,所以,拼图库的方块必然有很多被重复使用的。比如说满屏幕的 24 号...... 拼图库里 24 号对应的就是蔚蓝的天空。

16x16/(32x28)=28%,整个背景只有 28% 的内容是不重复的,剩下的 72% 必须重复,这是逼死美工狮的节奏啊。

所以,FC 游戏的过场动画大多都是很小的一块屏幕,比如:

全屏?美工狮:“臣妾做不到啊!”

FC 游戏已经把素材重复利用发挥到了极致。

大家有没有发现,这朵云和这颗树长得一模一样。

没错,云和树用了拼图库里同样的 6 个方块,只是换了颜色而已 。

它们是如何换颜色的呢?

用调色板(PALETTE)。

调色板,顾名思义,就是给方块上色的。

FC 一共可以用 53 种颜色,调色盘从这 53 种颜色里选取 3 种颜色,“透明”也算一种颜色(此时显示背景的底色),一共 4 种颜色。

这 4 种颜色用来给方块上色。

这就意味着每个方块只能有 4 种色彩。(注意,每个方块是 8*8=64 个像素)

绝对不可能有超过 4 种颜色的方块存在,请大家尽情地找吧,找到第 5 种颜色有大奖,奖品是 ps4 plus 一台。

调色板可以有 4 个,每个方块就有 4 个配色方案。

4 个调色板如图所示。

每一行就是一个调色板,数字表示该颜色的号码,0F 代表透明色。

聪明的小伙伴们知道云和树分别用的是哪个调色板吗?

当年的程序猿就是用如此巧妙的方法绘制背景来节省内存的。

但是,这种背景绘制方法是美工狮的灾难:

大家有没有发现,这些平台的边缘有点不正常,有锯齿状的东西。

给图片加上网格:

大家看出来了吗,这些锯齿就是因为方块与方块之间的过度没处理好所造成的。

前文说过,每个方块只能有 4 种颜色,如果两个方块用的调色盘颜色差异比较大,处理不好就容易出现这种问题。

所以,背景的绘制很考验美工狮的水平。

美工狮:“总监,我实在肝不动了......”

也有很多天才的美工狮用如此苛刻的条件做出精密的作品。

比如这个场景,惊为天人,完全看不出方块的痕迹,也看不出太多重复的东西。堪

称 FC 游戏美工的典范。

总监:“嗯,干的不错,晚上加鸡腿...... 乔豆麻呆,刚才那个背景也是你画的吧?”

其实这两张图出自同一个游戏,《忍者蛙》。

我带大家复习一下这章的内容。

1.FC 画面是由方块组成,而且方块只能在拼图库里找。

2.构成背景所用的方块至少有 72% 的内容重复。

3.每个方块只能有 4 种颜色,且总共有 4 种配色方案。

那么,用 FC 到底能不能画出美女来呢?必须可以!!大家坐稳,老司机开车了。

拿走,不谢,请叫我雷锋。

(2)角色

现在我们已经有背景了,再加上角色,就可以愉快地游戏了。

很幸运,角色和背景一样,也是由 8x8 的方块构成,然后由 4 色调色盘上色。

为什么说幸运呢?因为我可以不用把同样的内容讲两遍了......

就用大家最熟悉的《双截龙 2》做例子。

《双截龙 2》的主角就是大家最喜爱的比利:

Oh 不,应该是这个比利:

第一章里已经对方块进行过介绍了,在这里我就直接把网格画上。(为何裆部有一块迷之凸起?)

在这里,我们就不能把这个叫做方块了,我们要叫它“活动块”(sprite)。

活动块,顾名思义,就是“可以活动的方块”,背景的方块无法灵活活动,但是,活动块就没有这个限制,所以我们控制的角色可以上天入地,无所不能。

大家可以看出,比利一共由 10 块活动块拼成。游戏里,主角,敌人,子弹等一切活动的东西都是由活动块构成。

但是,活动块也不是无限使用的,不然为何真三国无双不出 FC 版(删除这句话)?

同一个画面最多能使用 64 个活动块。而且,64 块也不能随便乱用,因为 FC 是用“行”为单位逐行输出画面的,由于机能的限制,同一行最多只能输出 8 块活动块。

那么,万一同一行活动块超过这 8 块,会怎么样呢?FC 会瞬间爆炸?

我们先来玩一个找茬的游戏。大家来找茬:

无奖竞猜,以上 3 张图有几处不同?每张图的活动块都有不同程度地缺失。想必大家已经知道答案了吧!

当同一行活动块的数量超过 8 个的时候怎么办?只要让超过部分消失就行了。

程序猿:“我是处女座,每行活动块数量绝对不能超过 8 个!”

但是,消失过狠了,这游戏就没法玩了,可以看出来,图上有 2 颗子弹,一颗红色,一颗绿色,但是 3 张图都没有把子弹显示全。也就是说,子弹隐身了。

“子弹隐身?玩毛啊!”摔手柄。

在消失活动块时有个优先级设置,优先级低的活动块消失。

程序猿在设计游戏时,通常让每个活动块的优先级轮流起来。这一帧你优先级低,你滚蛋,下一帧我优先级低,我消失,谁也不吃亏。

此时,在玩家眼里就表现出闪烁的现象。

子弹并没有消失,只是变闪了,还能愉快玩耍。

但是,FC 游戏里有一些很庞大的 BOSS,怎么解释?

《超级魂斗罗》第一关的直升机 BOSS,宽度明显已经超过 8 个活动块了,为何它

没有闪烁?

这个问题问的太好了(观众:明明是你自己问的好不好)。

我偷偷告诉大家,其实这个 BOSS 不是敌人,而是背景。

惊不惊喜,意不意外?

用背景如何做出 BOSS 来?请看下一章。

(3)水平切割

上两章内容,已经介绍了 FC 画面的基本原理,这一章就是进阶内容。

水平切割(Raster Scroll)是背景处理的一个特殊技巧,能大幅提高游戏画面效果,广泛运用于 FC 后期的大作中,由于它比较重要,所以单独列出一章。

第一章讲了背景的组成,但是这种方法组成背景有局限性。背景只能有一张,缺乏层次感。

众所周知的一个道理,离我们近的东西走的快,离我们远的东西走的慢。当所有东西都绘制在同一张背景里时,就看不出快慢的区别了。

比如这张图:

当马里奥往前走时,所有的背景(山 树 云 砖块)都是同步运动的,就像在一张巨大的墙纸前移动,没有层次感,这显然和实际生活体验不服。

玩家对画质的追求是无止境的。

但这显然难不倒我们聪明的程序猿。

前面提到过,FC 是用“行”为单位逐行输出画面,那么,在输出完一行时,重写下一行背景的横坐标,就能造成背景行的错位现象,就能实现行与行之间的相对运动。

层次感就这样处来了。

看这个图,是不是舒服多了呢?

水平切割不止能制造出层次感,还能制造出巨大的 boss 来。

回到第二章的结尾。

第二章说过,活动块有 64 个总数限制和同行 8 个限制。直接用活动块做 BOSS 就难免显得小家子气。

《忍者龙剑传 3》的这个 boss,和隼龙差不多大,没有 boss 应有的魄力。但是没办法,这是活动块所能达到的极限了。

怎么办?

中国有句古话,“活动块不够,背景来凑!”

聪明的程序猿想到了用背景充当 boss 的方法。

大家有没有发现一个有趣的现象,凡是打这些用背景做的巨大 boss 时候,背景画面都是纯色的(以纯黑色居多)。

就拿刚才的《超级魂斗罗》为例,在打 boss 前,天上有云:

走过这个房子之后,云消失了,背景变成纯黑色:

打完 boss 之后,云又回来了:

让云消失,背景变成纯黑色,就是为了利用背景来绘制 boss。

假如云没消失,boss 战时云就会跟着 boss 一起动,那就露馅了。

Boss 水平移动的问题解决了。

那么,他是如何垂直移动的呢?

比如《超级魂斗罗》的第三关的 BOSS:

从地下徐徐升起的效果是如何实现的?请看下一章。

(4)命名表

命名表(nametable),其实,第一章和第三章的内容就是关于命名表的操作,为了能够循序渐进,所以在这里正式提出这个概念。

大家还记得第一章的这个图吗?

这就是一张命名表。

还记得第一章说过的话吗?

“整个屏幕被分成 32x28 个方块,每个方块包含一个编号,根据编号找到拼图库里对应的拼图,然后显示出来。”

FC 游戏的背景包含 2 张命名表,水平排列或者是垂直排列

比如《超级魂斗罗》第一关,就是水平排列的 2 张命名表。

半透明的那块是屏幕,也就是我们看到的部分。

然后,屏幕就在这命名表中滚动,不断刷出新的命名表。

场景看起来是无限延伸的,但命名表只有 2 张,这是不断滚动刷新的结果。

再回到第三关的 BOSS

这是垂直排列的两张命名表。

第三章提到过:“FC 是用“行”为单位逐行输出画面,那么,在输出完一行时,重写下一行背景的横坐标,就能造成背景行的错位现象,就能实现行与行之间的相对运动。”

重写背景的横坐标,就能达到水平位移的效果,那么重写纵坐标不就能达到垂直位移的效果了吗?没错。

引申一下,FC 在输出一行画面时可以决定输出命名表的任意一行画面,而不是严格按照命名表的顺序来。

BOSS 可以分成若干行,在输出画面时,第一帧输出 BOSS 的第一行,下一帧再加几行,以此类推,若干帧后 BOSS 就显示全了,这样就呈现出从地下徐徐升起的效果。

(5)某些游戏运用的奇技淫巧

看完了前四章内容,相信大家对 FC 打画面技术有一定的了解,下面我们就进行实战吧,对一些有特殊效果的画面进行分析,运用之前学的知识,看看这些特殊效果到底是如何实现的。

FC 游戏,堪称奇技淫巧的大合集,程序猿和美工狮们大显神通,运用这孱弱的机能实现了很多不可思议的效果。玩 FC 游戏的其中一个乐趣就是,看到一个不错的画面,思考它的实现原理。我将举一些例子,在我公布答案之前,大家可以思考一下,看看聪明的你能不能猜到答案。

1.震惊!一个方块居然出现了第五种颜色

第一章曾经说过,调色盘只能用 4 种颜色,所以一个方块最多只能有 4 种颜色。

但是,请大家看这张图。

请看箭头指出的那个位置,组成龙嘴的那个方块。

大家发现了什么没有?

把方块单独拿出来,放大看看。

数数有几种颜色。

黑 白 浅绿 深绿 红!

一共 5 种颜色!

我之前说过,一个方块绝对找不出第 5 种颜色,如果找出来,奖励什么来着?赶紧私信我要奖品吧。

但是这到底是怎么实现的,莫非是用了特殊芯片不成?

我就公布答案吧。

刚才说了,中国有句古话,“活动块不够,背景来凑!”

其实美国也有句俚语,“背景不够,活动块来凑!”

没错,这第 5 种颜色就是用活动块凑出来的。

这是去掉活动块之后的样子。只剩 4 种颜色:

一口洁白的牙就这么没了。

一个方块 + 一个活动块,里最多能显示 7 种颜色。为何不是 4+4=8 种?留给聪明的观众自己思考。

FC 游戏里,活动块和背景难舍难分,背景可以做 boss 弥补活动块的数量限制,活动块也能做一部分背景弥补背景不够灵活的缺点。一些 boss 就是背景和活动块共同组成。

比如《魂斗罗》中的这个 boss,身体是背景,灵巧的双手是活动块。

活动块:“我和背景君通力合作,不信阻止不了你!”

2.两根粗又硬打架,究竟是为何?

《鸟人战队》的关底 boss 战,机器人和 boss 对打。

两者的体型都比较大,那么,他们到底是活动块构成还是背景构成?

如果是活动块构成,同行的活动块数量肯定超过 8 个了,但是却没有出现活动块消失现象。

如果是背景构成,它们就无法相对运动。

给大家一分钟思考时间。

其实答案很简单,只要把对方打败就能看出来。

把对方打败之后,出现爆炸效果。

眼尖的朋友一下子看出来了,对方没有活动块消失,而我方却出现了活动块消失现象。游玩时候很明显感受到,此时我方在闪烁,对方没有闪烁。

这是因为爆炸效果是活动块构成的,同一行的活动块增加到超过 8 个,势必会产生闪烁现象。

我方闪烁,对方没闪烁。这意味着什么?我方是活动块,对方是背景。

活动块大战背景!大家猜对了吗?

本文来自微信公众号:编码珠玑 (ID:gh_f65e0111d17a),作者:编码珠玑 

THE END
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表亚设网的观点和立场。

2.jpg

关于我们

微信扫一扫,加关注

Top