当前位置: 华文问答 > 游戏

为什么魂斗罗只有128KB却可以实现那么长的剧情?

2016-08-27游戏

一个古老的问题,因为某些机构号挖坟,被我看到了。作为那个时代的亲历者,来给新生代程序员讲讲这里面的奥秘吧 。

其实,玩过小霸王学习机的话(不是打游戏,而是编程),应该多少都知道。没玩过的话,那种用文字拼的图,见过吧。网上有很多。那种图,显然比一张图片,容量要小多了吧。

FC时代的游戏,画面就是这个原理。整个画面是由一块一块「马赛克」拼出来的。就好像【我的世界】里面用块块拼各种造型那样。

因为是8bit CPU,int类型(准确来说,是可以直接操作的整数)是8bit。所以,索引范围是0-255。也就是这样的砖块最多能有256种。也就是说,你所看到的任何一关,都是由这最多256种砖块拼出来的。(当然,不同关卡可以使用不同的砖块,就好像【我的世界】里面的皮肤那样)

这个砖块的大小是8x8像素。FC的画面分辨率为256x240,容易计算得出就是32x30个砖块(tile)。

此外,砖块本身也并非是按照今天的图片那样,按照RGB三通道直接存储颜色,而是使用调色板。8bit的调色板虽然理论上最多可以支持256种颜色,但是实际上FC整体上只能输出64色(其中还有重复色):

而且即便是这64色还不能直接使用,而是要从中挑选出要用的颜色,放入到总共4个调色板当中,才可以使用。每个调色板只能有4色,其中0号颜色强制为透明。也就是说,每个调色板其实只能放入3个自选色(还必须从上面64个里面选),4个调色板共12色,+透明,共计13色。

每个砖块可以最多绑定一个调色板。因为一个调色板是4色,所以每个像素只需要2bit就可以索引这4种颜色。这样存储一个砖块的内存容量其实是8x8x2bit=16byte。256个砖块就是4KB。

然后其实画面分两层:背景、前景。背景可以使用单独的256个砖块,4个调色板;前景也有自己的256个砖块,4个调色板。所以这样的话一关最多是512个砖块,8个调色板。调色板数量很少存储大小忽略不计,512个砖块存储需要8KB。

然后就是实际记录游戏场景(背景)以及人物武器装备子弹等的开销。背景前面计算了,一屏幕需要32x30个砖块,砖块之间不能重叠。因为是从256个砖块里面选,所以需要8bit的索引。那么一屏幕(背景)就是32x30x8bit=960字节。

各个关卡的长度不一。下面是所有关卡的背景图:

以最长的第五关为例,该关背景图为5616x240,那么也就是横轴差不多22屏。这样的话存储这个背景所需的索引值的总容量就是960x22=21KB的样子。

前景。前景就是那些人物啊,子弹啊,炮台什么的。FC最多支持64个前景「精灵」(之所以叫这个名字是因为和背景的块块不同,前景的块块可以放在画面任何位置且可以相互重叠,像精灵一样漂浮)。每个8x8(或者8x16)像素。保守起见按全部都是8x16(2个tile)计算(事实上不是),那么总共就是8bit/tile * 2tile/sprit * 64 sprits = 128B。(注意游戏当中的角色等很多是由多个精灵组成的,特别是boss,所以精灵并不是和角色一对一的)

所以,满打满算,前景背景都用足256个砖块,且所有砖块都不同,8KB的砖块存储+前景索引128B+背景索引21KB/关 * 8关,大约176KB的样子。当然此外还有程序(逻辑)的部分,音频的部分(音频的部分其实是MIDI而且音符很少,大概CDEFGAB+cdefgab,也就是2个八度音阶的样子(音高。音色是通过三角波方波等波形控制,也有的游戏卡里加入了额外的波形生成芯片),容量很小),但是显然背景部分是最耗的。其它场景都没有第五关那么长,甚至部分关卡短得多,而且有些关卡之间雷同很高,砖块可以大量复用(比如如果仔细看第五关的背景图,显然不同的砖块远远少于256个)。所以这样看下来大致上128KB是没有问题的。