當前位置: 華文問答 > 遊戲

為什麽魂鬥羅只有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是沒有問題的。