用C在GBA上寫光線追蹤(0)配置開發(fā)編譯環(huán)境

前段時間用C#寫了一個光線追蹤程序日杈,可以渲染圓球挽封,平面這種基本圖形雾袱,反射庇麦,光照扁眯,陰影收津,都大致嘗試做了一下歹颓。之前的效果如下:

c#寫的光線追蹤渲染程序

然而铜秆,在我打算繼續(xù)深入優(yōu)化的時候奢米,我失去了我的好幫手強(qiáng)強(qiáng)電腦抓韩,換成了超極本∈鸦郏看來繼續(xù)做技術(shù)密集型光線追蹤是不行的了园蝠。就在這時,我看到了一些GBA的開發(fā)文章痢士,我又剛好有一臺GBA彪薛,于是我產(chǎn)生了一個大膽的想法——在GBA上實現(xiàn)光線追蹤。GBA架構(gòu)清晰簡明怠蹂,入手門檻低善延,而且還有一個官方的編程指南,很適合我這種人折騰城侧。

舊版GBA

在寫程序之前易遣,我要先花點時間了解GBA。GBA(Game Boy Advance)是任天堂2001年的推出的彩色游戲掌機(jī)嫌佑,它的前身是黑白掌機(jī)GB豆茫。

GBA有一個16位色深,240x160的液晶屏幕屋摇,初代無背光揩魂。

它有一個頻率為16.78Mhz的32位RISC類型的CPU(ARM7TDMI)。雖然和現(xiàn)在的幾GHz的處理器比起來實在太低炮温,但只要使用得當(dāng)火脉,還是可以做出很多東西的。

除此之外柒啤,它機(jī)身的內(nèi)存有兩部分倦挂,一個是32KB的內(nèi)部工作內(nèi)存,還有一個256KB的外部工作內(nèi)存担巩。這兩個內(nèi)存都是掉電數(shù)據(jù)就沒了的ROM方援。插入機(jī)身的游戲卡容量最大32M,游戲卡大部分內(nèi)存是只讀的涛癌,但一部分可擦寫儲存游戲存檔肯骇。

詳細(xì)的功能和GBA的運(yùn)行原理我就先不講了窥浪,我們從最迫切的配置開發(fā)和編譯的環(huán)境開始,之后再慢慢介紹功能笛丙。


本來我想直接從寫代碼開始講的,但是現(xiàn)在網(wǎng)絡(luò)上GBA的中文資料很少假颇,而GBA簡單的硬件又很適合學(xué)習(xí)系統(tǒng)底層和嵌入式開發(fā)胚鸯,所以我還是詳細(xì)的講述我了解到的所有知識,希望能吸引更多人了解并入門GBA編程笨鸡。

更好的教程:TONC教程:建立開發(fā)環(huán)境

開發(fā)前的準(zhǔn)備

Windows系統(tǒng)的電腦姜钳,因為我只有這個。

GBA主要使用C語言形耗,雖然也許能找到C++編譯到GBA的編譯器哥桥,但GBA上運(yùn)行的是裸機(jī)代碼,C速度快激涤,也適合和底層交互拟糕。因此要想玩好GBA,要熟悉C語言倦踢,了解系統(tǒng)底層原理送滞,不過即使不太會也沒關(guān)系,我也不會辱挥,用著用著 踩多幾個坑就熟悉了犁嗅。

為了方便測試,當(dāng)然要有一個GBA的模擬器晤碘,這樣就不用每次都把程序放到真機(jī)上運(yùn)行了褂微。我推薦mGBA,這是一個新開發(fā)(2013年)的模擬器园爷,開發(fā)它的人希望兼顧準(zhǔn)確性和速度宠蚂。它不僅可以顯示地圖,精靈腮介,調(diào)色板肥矢,還可以使用GDB調(diào)試(雖然我還不會)

如果你想在真機(jī)上運(yùn)行,可以采用兩種方法叠洗。1甘改、使用flash燒錄卡,將程序?qū)懭氲綗浛ɡ锞涂梢圆迦氲紾BA上運(yùn)行灭抑。但燒錄卡一般比較貴十艾,即使是GBA完全不流行的現(xiàn)在也要150~1000元。2腾节、使用multiboot線忘嫉,直接把程序送到機(jī)子256kB的內(nèi)存里荤牍,不用插卡就能運(yùn)行。這其實是利用了GBA多人連線游戲的功能庆冕,這個功能可以讓一臺機(jī)子通過連接線把小游戲發(fā)給其他機(jī)子康吵,這樣大家就可以一起玩小游戲了。我們通過把電腦假裝成一臺主機(jī)访递,就可以實現(xiàn)傳輸自己的程序晦嵌。這種特制線一般買不到,需要的話可以自制拷姿,不太難成本也低惭载。

要用什么編譯器?

對于這種嵌入式的開發(fā)响巢,最重要的是要有一套工具鏈描滔。工具鏈?zhǔn)侵妇幾g器、連接器踪古、解釋器和調(diào)試器這些組成的一套工具含长,它可以把我們的代碼編譯成在特定機(jī)器上運(yùn)行的機(jī)器代碼。不同的機(jī)器的工具鏈一般不通用灾炭,例如ARM公司就提供了它自己的產(chǎn)品的工具鏈茎芋。

ARM的官方編譯器

GBA用的就是ARM的CPU,因此可以從ARM那里找到工具鏈蜈出,但是時代久遠(yuǎn)田弥,有點難找,而且可能是收費的铡原。

gcc編譯器

除此之外我們可以使用gcc的編譯器偷厦,gcc是免費開源的編譯器,是開源計劃里的重要組成部分燕刻,這個東西大概程序員都知道只泼,程序員們希望世界上所有程序都是開源的,可以自由修改卵洗,于是他們一起做了一個開源的編譯器(gcc)请唱,然后通過編譯器做了開源的系統(tǒng)(linux),然后在系統(tǒng)上寫了開源的軟件过蹂。一般的gcc是編譯到linux的十绑,但也有編譯到ARM的gcc-arm。我們只需要針對GBA配置一個就可以了酷勺,當(dāng)然我不會本橙,不過一些GBA愛好者已經(jīng)為我們做好了。

DevKitAdv:這個比較舊脆诉,需要使用.bat腳本管理編譯甚亭。

devkitPro:整合了多個游戲機(jī)的工具鏈贷币,支持GBA,NDS,PSP,NS等,可以按需下載亏狰,有這個新的就沒必要用舊的了役纹。這個工具內(nèi)有一些makefile模板,可以使用makefile方便的管理要編譯的內(nèi)容暇唾,輸入make就可以編譯字管,很有了解的必要。

這些工具鏈中也提供了用于GBA的庫libgba信不,包含了常用類型和數(shù)學(xué)運(yùn)算庫,內(nèi)存操作亡呵,中斷系統(tǒng)等一些常用的功能抽活。

安裝工具鏈

我這里介紹devkit Pro的安裝:

去論壇里下載devkit Pro的Windows安裝包,名稱是devkitProUpdater锰什,選擇安裝位置(建議C盤根目錄)下硕,點選需要的組件(GBA),之后就會開始聯(lián)網(wǎng)下載汁胆。

選擇devkitPro組件

安裝之后打開安裝目錄梭姓,看看包含什么:

devkitARM:這就是工具鏈

examples:示例文件,里面有圖像嫩码、音頻演示誉尖,xboo連接線項目,還有一個空的項目模板铸题。

libgba: devkitPro的GBA庫铡恕;

libtonc:tonc教程的作者寫的GBA庫。

tools:一些小工具丢间,例如修復(fù)rom頭部探熔,圖像轉(zhuǎn)換。

sys2等一些安裝文件烘挫。

測試工具鏈

現(xiàn)在來測試能不能正常使用工具鏈诀艰。

打開examples->gba->graphics->SimpleBGScroll,在這里打開cmd(shift+右鍵菜單)(win10下是powershell)

在cmd下輸入 make 饮六,看看有沒有編譯出一個build文件夾和.gba的rom文件其垄。

成功編譯的輸出

如果成功了,恭喜你喜滨,可以開始寫代碼了捉捅!

錯誤的解決方法

如果有錯誤,我這里列出了2種可能的原因:

1虽风、cmd/PowerShell的目錄地址不在 \divkitPro\examples\gba\graphics\SimpleBGScroll棒口。

2寄月、make指令是調(diào)用工具鏈里make.exe,如果沒有添加Path无牵,系統(tǒng)會找不到這個程序漾肮。

打開環(huán)境變量的窗口,檢查是否已經(jīng)配置了變量茎毁。正常情況下克懊,應(yīng)該有四個:1、在Path里的“c:\devkitPro\msys2\usr\bin”七蜘,2谭溉、名稱為DEVKITARM的“/opt/devkitpro/devkitARM”,3橡卤、名稱為DEVKITPPC的“/opt/devkitpro/devkitPPC” 扮念,4、名稱為DEVKITPRO的“/opt/devkitpro”碧库。

如果檢查無誤還是不行柜与,可以試試卸載重裝orz

配置開發(fā)環(huán)境

我也不知道怎么配置一個既可以一鍵編譯,又可以進(jìn)行調(diào)試的開發(fā)環(huán)境嵌灰。我只能介紹一下我摸索出來的勉強(qiáng)能用的方法弄匕。

我使用的是VisualStudio 2019,好像很多人覺得vs不適合嵌入式和Linux開發(fā)沽瞭,但我vs用慣了迁匠,能不換就不換。vs2017后加入了Linux的開發(fā)組件秕脓,我覺得還是很好用的柒瓣。如果你使用的不是vs,可以直接看文章末尾的TONC教程和附錄里的其他方法吠架。

首先我們需要安裝VS2019的c/c++開發(fā)組件芙贫,還有Linux開發(fā)組件(為了可以建立makefile項目)

安裝完成之后啟動vs,新建一個makefile項目(翻譯為生成文件項目)傍药。

之后我們需要在項目屬性的NMake里設(shè)置include文件的位置和make等命令磺平。

包含搜索路徑?設(shè)置為 /divkitPro/libgba/include和/libtonc/include的地址。

生成命令行?輸入 make

最后一步拐辽,我們到devkitPro的examples里把示例文件的makefile復(fù)制到我們的項目根目錄下拣挪。

生成

如果源文件里已經(jīng)有main.c了,現(xiàn)在按生成->生成*你的項目名稱* 或者Ctrl + B 應(yīng)該就可以編譯代碼生成.gba文件了俱诸。

新建源文件

之后如果我們要新建一個源文件菠劝,在解決方案資源管理器的源文件里新建項,名稱為xxx.c 睁搭,后綴為c赶诊,目錄為項目里的/source

新建頭文件

解決方案資源管理器的頭文件里新建項笼平,選擇.h文件,并新建一個include文件夾舔痪。如果新建了include文件夾寓调,要記得把這個文件夾地址加入項目的包含搜索路徑。此外我們還要修改添加makefile里的include路徑锄码,不然編譯器不知道夺英。

由于makefile已經(jīng)寫好了模板,所以我們只需要在INCLUDES := 后面寫include滋捶,他就會自動識別為項目目錄/include痛悯。如果項目目錄里有多個include文件夾,可以在include后加空格重窟,再寫名稱灸蟆。

makefile模板里有3處include地址:

1、我們寫的 INCLUDES := xxx 亲族,是項目目錄里的。

2可缚、devkitPro自帶的兩個庫里的include

3霎迫、項目編譯后產(chǎn)生的Build目錄


到這里應(yīng)該已經(jīng)介紹完配置環(huán)境的問題了,之后要學(xué)的就是如何編程使用GBA上的硬件帘靡。在下一篇文章之前知给,我先推薦一些對學(xué)習(xí)GBA編程很有幫助的內(nèi)容。

開發(fā)資料推薦

GBA編程手冊描姚。這個好像是官方的手冊涩赢,中文版翻譯到第六章就沒了。里面說明了GBA的硬件和功能轩勘,相當(dāng)于GBA的說明書筒扒,應(yīng)該是最有用的資料。

GBA教程TONC绊寻。非常全面花墩,很有深度,但有些地方難度也比較大澄步。這個教程也講了如何配置環(huán)境冰蘑,包括visual c++ 和 NP2編輯器的配置。此外還講了makefile的原理和編寫方法村缸。(可惜中國打不開)

GBA開發(fā)網(wǎng)站祠肥。存了很多開發(fā)的軟件和資料,還有別人做好的游戲梯皿。



下一篇文章我會再講講GBA的硬件和基本運(yùn)行原理仇箱,之后就開始寫光線追蹤程序县恕。

如果有機(jī)會我會再寫一篇文章講講如何調(diào)試GBA程序。


附錄

Eclipse+devkitPor搭個GBA開發(fā)環(huán)境

GBA開發(fā)入門:做一個名叫Hello World的游戲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末工碾,一起剝皮案震驚了整個濱河市弱睦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渊额,老刑警劉巖况木,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旬迹,居然都是意外死亡火惊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門奔垦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屹耐,“玉大人,你說我怎么就攤上這事椿猎』塘耄” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵犯眠,是天一觀的道長按灶。 經(jīng)常有香客問我,道長筐咧,這世上最難降的妖魔是什么鸯旁? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮量蕊,結(jié)果婚禮上铺罢,老公的妹妹穿的比我還像新娘。我一直安慰自己残炮,他們只是感情好韭赘,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著势就,像睡著了一般辞居。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛋勺,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天瓦灶,我揣著相機(jī)與錄音,去河邊找鬼抱完。 笑死贼陶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碉怔,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼烘贴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撮胧?” 一聲冷哼從身側(cè)響起桨踪,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芹啥,沒想到半個月后锻离,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡墓怀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年汽纠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傀履。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡虱朵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钓账,到底是詐尸還是另有隱情碴犬,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布梆暮,位于F島的核電站翅敌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惕蹄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一治专、第九天 我趴在偏房一處隱蔽的房頂上張望卖陵。 院中可真熱鬧,春花似錦张峰、人聲如沸泪蔫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撩荣。三九已至,卻和暖如春饶深,著一層夾襖步出監(jiān)牢的瞬間餐曹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工敌厘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留台猴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像饱狂,于是被迫代替她去往敵國和親曹步。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容