编程黑科技:能玩几个小时的《魂斗罗》居然只有128KB

《魂斗罗》一直是80后90后这一代人经典的童年回忆之一,曾经的无数个日夜,我们都坐在电视前搓着手柄度过。

 

 

然而,长大之后的汇智妹回头去看时,才惊奇地发现。《魂斗罗》的卡带大小只有128KB而已!拥有更多动画细节和隐藏内容的日版《魂斗罗》也仅仅只有256KB而已。

 

128KB有多小?

128KB到底有多小呢?汇智妹随手新建了一个txt文档,复制了一堆汉字上去。

 

我们知道一个汉字占两个字节,那么128KB排得满满当当,也只能装满一篇65536个字的文章。

可能会有人说六七万字也挺多了,这么多字放在网文里,也就只有21章的样子。放在《斗破苍穹》里,萧炎才刚刚知道啥是炼药师。

就这么区区128KB是怎么装得下那么多图像、音效、数据的呢?

 

FC机能有多差?

我们首先需要知道一件事儿,那就是红白机FC的分辨率为256×240,显存却只有2KB

如果按照像素点来显示画面的话,256×240总共有61440个像素点。

哪怕只用黑白来显示,一个像素点用一个bit就可以显示。整个画面都需要7.5KB的显存来存储,那FC怕不是直接爆炸。

 

按理说,红白机从硬件上就不应该出现,但它就是出现了。

 

Tile的拼接技巧

为了能够在历史上出现,红白机在硬件上提供了一种充分利用显存的方法——Tile(我们姑且给它翻译成方块)。

一个方块的大小是8×8,整个屏幕画面就是由32×30个方块拼起来的。

 

 

当仔细看过这些格子之后,我们会发现有大部分格子的画面是完全一致的。也就是说我们可以制作一张背景方块库,从库中索引对应的方块就可以大大减少缓存了。

 

这么讲可能有点不太直观,汇智妹没有找到《魂斗罗》所使用的图库,但找到了另一款游戏《超级玛丽》的图库,就是这个。

一张16×16的方块图就可以完全涵盖所有的背景内容!编好号之后,直接索引就可以了。这样一来实际占用显存的也不再是像素数据,而是方块编号!

这些编号才有多大呢?也就960个数字而已。

 

玩出花儿来的调色板!

 

可能还有同学会想:不对啊,这个图上的云只有下半部分啊!

没错!因为云朵的上半部分和草丛的上半部分形状是完全一致的!仅仅改变了颜色

FC中总共可以使用53种颜色,调色板从中选取3种颜色为方块上色,还有一种是“透明”色。也就是说每个方块最多只会出现4种颜色。

 

如果你在某个方块中发现了超过4种颜色,那一定是出现了方块以外的东西。

像下图这样的场景,除了无比精巧的设计,还有美工的肝……

 

上天入地:Sprite!

缺乏变化的背景解决了,但一款游戏不能没有角色和效果啊!

 

有了方块的先例,FC就自然而然地引入了一种新的方块——Sprite(雪碧,并不,我们姑且翻译为活动块)。

跟方块一样,活动块同样由8×8的像素点构成,上色也是3种颜色和1个“透明”色。这也就将8×8的小格子里可以出现的颜色增加到了7种

 

比起紧密排列的方块来,活动块可谓是上天入地,无所不能。

 

 

但这样灵活的活动块却有一个严格的限制——同一画面中最多使用64个活动块。

而且,这64个活动块也不能随便使用,在同一行最多只能输出8个活动块。一旦超过8个,FC还是会瞬间爆炸。

 

隐身子弹和无影腿!

 

这个问题被程序员们以无比粗暴的方式解决了:同一行中超过8个的活动块就让它们消失

于是,游戏中就出现了“缺胳膊少腿儿”,甚至“子弹隐身”的现象。

 

 

但是这游戏要是这样,那可没法玩了呀。

为了解决这个问题,程序员们为活动块们设定了优先级,优先级低的活动块消失。之后又让活动块的优先级轮流滚动

 

这样一来,上一帧子弹消失,下一帧腿消失。画面呈现出来就只是闪烁而已,并不会有哪一个活动块永远“隐身”。游戏也终于可以正常玩耍了。

 

BOSS的真实身份是背景

我们知道在魂斗罗中有不少大型BOSS,而这些BOSS远不止8个活动块可以容纳的,这又是怎么回事呢?

 

 

答案其实很简单,这个BOSS不是活动块,而是方块拼成的。也就是说,这个BOSS被画在背景里

比如在下面这张图中,我们可以很明显看到背景是有云层的。

 

 

但在打BOSS之前,云层就消失了。因为这时的方块要用来画BOSS了,再画云就会穿帮!

 

 

打完BOSS后重新出现的云层也印证了这一点。

 

 

音轨劳模:噪声!

画面节约至此,音乐也丝毫不肯让步。

 

在FC的时代,音乐是由音频芯片产生的,音色非常有限,但却可以同时播放多个音轨。《魂斗罗》的音乐就是依靠多个音轨的交替配合实现的。

每个音符只需要记录音色、频率和音高就行了。这样的数据量明显要小上许多。而游戏音乐又基本都是循环播放的,数据量就变得更小了。

值得一提的是,FC中有四个音轨,两个方形波,一个三角波和一个噪声。噪声负责表示鼓点、爆炸、脚步、撞击等等各种音效。由于机能实在太不够看,所以一般出现爆炸、撞击等音效时,音乐是没有鼓点的!

 

懂硬件的程序员!

 

画面和音乐都以极其苛刻的程度完成,代码也苛刻到不浪费每一个bit

FC的代码不是C,不是Java,更不是Python之类,而是通过汇编直接操作硬件,基本不存在指令浪费,这样做一来反应快,二来代码量极少。

 

那个时代的程序员,不光要会汇编,还要懂硬件!

正是由于对空间如此苛刻的节省,《魂斗罗》才能以128KB的大小面世。也正是因此,我们的童年才有了FC留下的浓墨重彩的一笔。

 

前辈程序员创造了我们的童年回忆,那未来孩子们的童年回忆自然就落在了我们这一代程序员的身上。

没有了FC的各种机能限制,有了各种高级编程语言的辅助,我们可以做得更好,不是吗?

 

什么?你说你不会编程?快来向汇智妹详细了解了解~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章