編程黑科技:能玩幾個小時的《魂鬥羅》居然只有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的各種機能限制,有了各種高級編程語言的輔助,我們可以做得更好,不是嗎?

 

什麼?你說你不會編程?快來向匯智妹詳細瞭解瞭解~

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