您好,登錄后才能下訂單哦!
cpp-empty-test是cocos2dx3.2自帶的一個c++的最簡單的例子,基本也是使用使用C++開發cocos2dx3.2程序的工程模板。在開始拆析游戲模塊之前,讓我來看看這個簡單的工程有些什么。
打開文件夾看到的是這個樣子的:
把以 proj 開頭的文件夾除開后,其實只剩下 Classes 文件夾和 Resources 文件夾,那個json文件其實是一個配置說明,打開看看就知道它不過是記錄了在不同平臺下的工程文件的路徑啊、target名字啊等,那個CMakeLists.txt文件是為了使用CMake這個工具的,至于這個工具是什么,它跟make有什么關系,可以看看這里:http://blog.csdn.net/u012150179/article/details/17852273
根據經驗,我知道那些proj開頭的文件夾都是各個平臺下的編譯工程,誰叫cocos2dx是跨平臺的呢。我們的游戲會支持android平臺,但是開發我還是得在windows平臺下開發,所以我先看看windows平臺的工程吧,打開之后看到的是這樣的:
突然發現除了上面 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看看:
意外的簡單,一個標準的windows平臺入口main函數,真正有用的代碼其實就是那個return,創建了AppDelegate類之后調用了run函數。目測這樣游戲就跑起來了。
再打開main里面引用的Classes文件夾下的 AppDelegate.h文件,可以看到 AppDelegate類是繼承自libcocos2d庫的Application類的。當然,我應該繼續追下去,不過這里就打住吧,我今天只是想打一壺醬油。那么大致明白了,AppDelegate類里面應該是創建了一個導演然后跑起來后面的helloscene的場景,至于到底干了什么今天就不看了。
本來醬油已經打滿了,可以回家炒番茄了,但天性好奇的我又打開了android工程,想看看android這個google推出的傳說中的系統的一個程序的工程目錄是啥樣子的,于是我看到了這些:
除開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,于是我去官網上看了下:
iphone6用的A8無誤,再看看mac吧:
赤裸裸的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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。