從cpp-empty-test說起

cpp-empty-test是cocos2dx3.2自帶的一個c++的最簡單的例子,基本也是使用使用C++開發cocos2dx3.2程序的工程模板。在開始拆析遊戲模塊之前,讓我來看看這個簡單的工程有些什麼。


打開文件夾看到的是這個樣子的:

wKiom1SJfeOiZPlaAAGJaBWKkyk088.jpg

把以 proj 開頭的文件夾除開後,其實只剩下 Classes 文件夾和 Resources 文件夾,那個json文件其實是一個配置說明,打開看看就知道它不過是記錄了在不同平臺下的工程文件的路徑啊、target名字啊等,那個CMakeLists.txt文件是爲了使用CMake這個工具的,至於這個工具是什麼,它跟make有什麼關係,可以看看這裏:http://blog.csdn.net/u012150179/article/details/17852273


根據經驗,我知道那些proj開頭的文件夾都是各個平臺下的編譯工程,誰叫cocos2dx是跨平臺的呢。我們的遊戲會支持android平臺,但是開發我還是得在windows平臺下開發,所以我先看看windows平臺的工程吧,打開之後看到的是這樣的:

wKioL1SJfo6A5ZDDAACUA_KkNpE523.jpg

突然發現除了上面 Classes 文件夾下的5個文件外,還多了main.h和main.cpp,這兩個文件被放在了 proj.win32 文件夾下面,略一思考也就明白了,畢竟是要針對不同平臺,那麼入口函數必然不同,所以在各個不同的工程文件夾下估計都會放着各自的程序入口的代碼,在windows平臺下是這個main.cpp。這麼看來cocos2dx的代碼還是不錯的,跟遊戲相關的代碼是通用的,都放在Classes文件夾下,不用針對不同平臺編寫不同的代碼,這也就是說cocos2dx跨平臺的含義吧。但是畢竟各個平臺有區別,這有區分的代碼就放在各自的工程目錄下,這裏我們的empty-test沒有多餘的內容,所以只需要一個程序入口代碼就OK了。由此可以猜想,coocs2dx的引擎代碼裏肯定有很多#if windows啊,#if ios之類的條件編譯,而引擎需要引用其他的功能時,肯定也是儘量使用那些跨平臺的庫,當然,那些庫裏肯定也是一堆的#if windows條件編譯,另一個辦法是引擎代碼直接根據不同的平臺來引用那些不同平臺下的庫。


打開main.cpp看看:

wKioL1SJfpviFKQ2AAGUlEf4NzQ494.jpg

意外的簡單,一個標準的windows平臺入口main函數,真正有用的代碼其實就是那個return,創建了AppDelegate類之後調用了run函數。目測這樣遊戲就跑起來了。

再打開main裏面引用的Classes文件夾下的 AppDelegate.h文件,可以看到 AppDelegate類是繼承自libcocos2d庫的Application類的。當然,我應該繼續追下去,不過這裏就打住吧,我今天只是想打一壺醬油。那麼大致明白了,AppDelegate類裏面應該是創建了一個導演然後跑起來後面的helloscene的場景,至於到底幹了什麼今天就不看了。


本來醬油已經打滿了,可以回家炒番茄了,但天性好奇的我又打開了android工程,想看看android這個google推出的傳說中的系統的一個程序的工程目錄是啥樣子的,於是我看到了這些:

wKiom1SJfhHx319dAAHfxouKT9M538.jpg

除開readme不談,那裏面其實講的都是廢話,我喜歡從腳本看起,簡單看了下ndkgdb.sh,從名字就差不多知道它一定是用gdb來調試,至於前面的ndk,我還是知道點的,用ndk可以把C/C++代碼編譯成so庫,總之這個腳本目測是用來調試的。

接下去就是各種配置文件了,無論是xml還是json還是txt,還是高大上的properties、project、classpath都是配置,至於這些配置到底是被誰用,那需要去找google娘。然後我把目光放到了那三個文件夾,res文件夾看了看發現比較簡單,裏面就是各種不同屏幕大小下的app的圖標,再來看src裏面只有一個java文件,目測這個java的作用應該和windows下的main.cpp的作用類似。然後只剩那個神奇的jni文件夾了。我本人由於最開始受到國內那弱弱的計算機科學教育體系的影響,第一門語言學的是c,然後我就討厭c++和java了,我不知道其他的受弱弱的大學教育的影響一開始學的是c的人,是不是跟我一樣,從那以後就討厭java了,甚至討厭一切面嚮對象語言,即使之後當我明白了面向對象只是一種編程思想後,我還是討厭面嚮對象語言,冏!


扯遠了,再來說說jni,找google娘撒了會嬌,看到了這裏:http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html,還有這裏:http://docs.anysdk.com/JNITutorial。

本來到此爲止,我就該回家吃飯了的。但是我看到了anysdk裏開發環境搭建的第一句話“1.android的NDK開發需要在linux下進行: 因爲需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。

天殺的,我突然極其想吐槽,爲毛我寫的代碼需要經過這麼多波折才能在android平臺下運行,難道windows大法不好嗎?於是我又補了點考試常考的知識。ARM平臺和大多數pc運行的X86平臺,到底有何區別。


這一切都要歸結到信仰的不同,哇擦,居然都上升到信仰的高度了,話說我一開始其實真的是來打醬油的。在很久很久以前,其實也沒有多久,有些人認爲CPU的指令集是越複雜越好,因爲這樣意味着CPU可以非常方便而直接的幹一些事情,比如如果指令集裏面只有加法指令,那麼在做乘法的時候,只能不停的去加才能實現,但是如果真有一條直接做乘法的指令,那麼執行起來必然是很快的,這裏不要吐槽我,我只是舉個栗子,CPU裏當然不會有乘法器,因爲用二進制,所以乘法有很多優化方式,這裏不談。但是,這種想法有點像我們寫代碼的時候,給一個類添加了一些功能,但是有些功能可能用不到,爲了儘可能讓我們的類看起來強大,我們會提供儘可能多的接口來滿足用戶,那麼我們就需要導出更多的接口。所以複雜指令集CISC架構的CPU越做越複雜,當然,性能也是越強大,這裏的性能是指運行速度,我們常聽說的intel就是CISC得死忠。我們可以看到intel已經在各個計算機芯片領域都強大到讓人一眼望不穿的地步,幾乎統治了整個PC機市場,當然這和他們跟微軟合作分不開,而且由於intel的這種常年統治,導致大量開發者開發的軟件其實都是基於這個架構,也就是所謂的X86架構來開發軟件,爲什麼叫X86,這麼羞羞的問題你問google娘去啊!intel也是一家偉大的公司,他們不斷創新,增加他們的指令集,不斷採用新的製程,什麼65納米、55納米、45納米,什麼奔騰、安騰、酷睿、至強巴拉巴拉的,2GHZ、3GHZ、4GHZ,單核、雙核、四核、八核!噢,叼!更叼的是intel經過這麼多年,架構的兼容性做的真心是好,要不是各個操作系統懶得寫那麼複雜,30年前的程序甚至都可以跑在今天的系統上。


可是世界是辯證的,就在CISC這邊風景獨好的時候,RISC出現了,精簡指令集系統,這羣人認爲CPU的指令集應該是越精簡越好,因爲這意味着CPU做的事情都是非常簡單的,那麼CPU從結構上就可以設計的很簡單,從而能夠擁有更好的和其他硬件交互的能力,我的第一感覺是這幫人一定適合跟外星人交流,因爲他們肯定能找到必然需要而且又最簡單的能夠表達絕大部分意義的語言。ARM,Advanced RISC Machines誕生了,ARM的誕生是歷史的必然,但是它只賣技術授權,不自己做CPU倒是沒想到的,估計是沒有intel那種魄力和錢,純屬我猜測,當然可能更多的考慮是想搭建一個開放的架構,讓大家都可以設計自己的CPU,當然,這並不是說arm的CPU架構就一定是精簡的,功能單一的,因爲CPU核心確實是簡單,所以可以和其他芯片很容易的整合到一起,比如蘋果大名鼎鼎的A8芯片,提到蘋果,我突然想起個問題,既然蘋果ios系統用的是自己研發的基於arm架構的A8芯片,那mac呢?難道也是用的A8,如果不是的話,豈不是蘋果自己的兩套系統用着兩種不同的CPU,於是我去官網上看了下:

wKioL1SJfrqjutISAALA6CkqfNE016.jpg

iphone6用的A8無誤,再看看mac吧:

wKiom1SJfjDwVykLAAG-9lmFWag757.jpg

赤裸裸的intel i7處理器啊。。淚奔,果然是這樣。順帶再吐槽下蘋果中文官網的廣告語“豈止於大”。然後我想了想,好像只有高通和蘋果兩家現在還在做arm芯片比較有名,但arm芯片也確實基本統治了移動平臺,在除了pc以外的各種設備上,更加常見的反而是arm芯片。我猜想這中間肯定有很多有趣的故事,於是乎找google娘問了下,果然很有趣,想知道的自己去問吧。


終於要說到android了,google娘出的基於arm架構開發的操作系統,在現在各種新興的設備上,什麼手機、手環、電視、手錶、眼鏡、頭盔等各種可穿戴設備上,基本是arm+android的搭配。經過上面的分析,我們知道RISC設計的CPU肯定要比CISC要簡單,那麼性能上,也就是運行頻率一般是趕不上CISC設計的CPU的,在製作工藝上估計也趕不上intel這種積累了幾十年專注於這麼一件事情上,而且無論從兼容性還是硬件可擴展性、軟件開發的方便上以及可用工具的豐富層度上來說,肯定依然是趕不上intel的。那麼爲什麼我們還能看到arm+android統治市場呢?思來想去,我看看了以前蘋果發佈的文章,才終於想到,原來是功耗的差異,我們可以看到CISC架構的追求方向非常明確,就是性能,所以我們看到intel各種推陳出新,一代更比一代強,CPU核心頻率動不動就3,4GHZ,而我們看一般我們手機CPU的頻率,即使是最新款的手機差不多也就1GHZ多的樣子,完全不是對手,但是由於CISC架構CPU這種追求,導致它的功耗也自然更高,我記得我的電腦電源是有350W的,但是我手機肯定沒這麼高的功率,所以要在我手機上跑這麼個高帥富,我自己都不信,但是跑一個只需求幾十W的arm芯片,我還是可以認同的。在電池能源這麼緊張的設備上,跑個1GHZ的芯片,我都覺得每天一充電抓狂,更何況讓我跑個3GHZ的芯片,吃一頓飯充一次。順帶提一點,linux也是基於arm架構開發的系統,真心是一直等到google娘開發出android,才讓linux大展宏圖啊。

我必須要回家吃飯了,已經餓昏了。天下大事,分久必合,合久必分。目測未來arm芯片肯定是朝着性能方向發展,intel芯片肯定是朝低功耗方向努力。


以上純屬YY,若有不對的地方不用告訴我了,我真的是出來打醬油的,有篇文章寫的不錯,可以看看:http://ihyperwin.iteye.com/blog/1701132


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