cocos2d-x為什麼大量使用宏定義函數,而不選擇使用模板?

看過不少書,都說盡量少使用宏。比如《Effective C++》條款2:用inline template代替宏。(感謝梁錦峰)

為什麼cocos2dx有很多函數都是採用宏定義,不能用模板函數替代嗎?


先有cocos2d-python, 之後移植到iOS上面,成了cocos2d-iphone。cocos2d-iphone使用objc編寫。

隨著iOS的流行,cocos2d-iphone在iOS的遊戲開發中,變得流行。cocos2dx是在cocos2d-iphone流行之後,採用C++重新編寫的,x表示cross, 就是cross platform(跨平台)的意思。

在3.0之前,cocos2dx只是在在cocos2d-iphone後面跟隨模仿,所有的介面,類名,設計跟cocos2d-iphone一模一樣,只是使用C++來模仿objc的特性。CCObject, CCArray, retain, release, autorelease 等等概念,其實從objc中來的。

在3.0之前,cocos2dx的代碼質量從C++的角度來看,客氣點說,是不怎麼樣。不客氣說,就是糟糕。但因為它解決了用戶跨平台的迫切需求,並且也算容易使用,所以cocos2dx慢慢變得流行。

為什麼大量使用宏定義函數,而不選擇使用模板?簡單回答,就是因為cocos2dx需要模仿cocos2d-iphone, 也就需要使用C++來模仿objc的特性,有些在objc中很自然的特性,在C++中沒有對應的,也只好使用宏來模仿。而objc並沒有模板,在cocos2dx中,也不能使用模板,一旦使用模板,相比宏,更容易引起cocos2dx和cocos2d-iphone介面的分化。模板也算C++中比較高級的特性了,從objc轉過來的cocos2d-iphone的程序員,也難以掌握模板。

那為什麼cocos2dx一定要跟隨cocos2d-iphone呢?因為在早期,cocos2d-iphone使用的人數遠遠比cocos2dx多。cocos2d-iphone的勢大,很多開發iOS遊戲的人更熟悉cocos2d-iphone的介面。並且已經有些遊戲採用cocos2d-iphone編寫了,跨平台是後來的需求。cocos2dx設計跟隨cocos2d-iphone,遊戲開發者遷移到cocos2dx的代價更少,介面的學習成本會很少。假如那時,cocos2dx自己設計一套介面,就算技術更好,代碼質量更好,也很難像今天那樣流行。當然了,介面自己設計一套,也就不能稱呼成cocos2dx了。

就算是今天,也會有很多開源的2D引擎,技術上比cocos2dx好,代碼質量也比cocos2dx好。但就沒有cocos2dx這樣流行。市場從來不是簡單選擇技術最好的。

隨著cocos2dx變得越來越流行,cocos2dx跟cocos2d-iphone的地位反過來了,現在的開發者更熟悉cocos2dx。這個時候,cocos2dx就可以放開手腳來重新設計。3.0之後,它的代碼更加符合C++的習慣,而並非僅僅模仿objc。可以說,3.0是個分界點,從那個時候開始,cocos2dx才勉強算是一個獨立的2D引擎,之前只是附庸狀態。

現在,cocos2d-iphone夾在跨平台的cocos2dx,和蘋果出的SpriteKit之間,地位變得很尷尬,處在半死不活的殭屍狀態,就看啥時候斷氣了。


因為3.0之前的cocos2d-x都是在模仿Objective-C上的cocos2d-iphone來寫的,遇到那堆Objective-C特有的特性怎麼辦?模仿唄

c++里沒有selector怎麼辦?於是定義了一堆XXXX_selector宏用來傳入一個類的成員函數指針。

c++沒有辦法用foreach形式訪問CCArray怎麼辦?於是寫了個FOREACH_ARRAY宏。

c++裡面有個名字空間,OC的沒有怎麼辦? 於是定義了一堆NS_XXX_YYY的宏(這個完全理解不能啊,這個宏輸入的字元數比正常寫都多)

順便吐槽一下,不要迷信遊戲引擎的質量啊,每次我用NDK里的Clang編譯那一堆堆的Warnning沒人關注過么?

無符號和有符號數比較這種小問題就不提了,誰來解釋一下那一堆堆的 「Warnning:Undefined Behavior」 是怎麼回事?

以上僅代表3.0之前的引擎,3.0之後據說整個引擎重寫了,用的次數不多,不過很多地方更c++樣式了,比如上面說的selector那個地方,可以直接傳入一個函數對象了,不過還是有很多宏的存在


關門,放Gobject!!


C/Objc/C++/Objc++程序員分為四種

1:濫用宏,然後告訴你指針和模板沒事不要用

2:濫用指針,然後告訴你宏和模板沒事不要用

3:濫用模板,然後告訴你宏和指針沒事不要用

4:搞不下去換別的語言的,告訴你C/Objc/C++/Objc++沒事不要用


@黃兢成 的眼光好犀利。

cocos2d-x早期版本大量往objc靠攏的好處是:

1. 轉換cocos2d-iphone社區的用戶過來

2. C++模版這玩意兒,Objective-C程序員可不懂。但是用宏他們就懂了,方便Objective-C程序員移植。

所以這是商業角度出發的方式,而不是從技術角度出發的。2010~2011年時,從cocos2d-iphone分支出來嘗試解決跨平台問題的引擎還有若干個,無不自作聰明改進介面、改進結構,結果全死了。


我也覺得cocos2d-x裡面大量的宏定義函數有點彆扭,不過換成模板也不見得有多少改善,

書上說盡量少用宏,基本上都指出宏定義函數運算符優先順序問題還有宏定義出錯的話,要在預處理階段之後的編譯階段才能發現,這東西不提供類型安全檢查,就像編輯器里的替換功能一樣.

嗯,Effective C++ 條款2也提到用template inline函數代替類似函數的宏.

我也想知道cocos2d-x是怎麼考慮的呢?

嘛,C++也經常因為這樣那樣的原因被說難用不好用了.

其實我是不大同意的,要C++能說話的話:人家這麼靈活,都讓你隨便用了,你用不好怪我咯?


都是oc跟c++的區別造成的,3.x之後不用看cocos2d-iphone臉色了,你說的問題會逐步消失掉的, 昨天的低聲下氣是為了今天的反客為主。


為了降低他們和使用者的檔次。

他們不懂C++。


模板可讀性太差了,宏簡單直接了當,盡量少用c++特效,Cocos2dx設計模式向objectc靠攏


推薦閱讀:

遊戲開發者怎麼讓玩家互相產生仇恨?
「開局一個人一條狗一把槍,裝備全靠撿,一刀999級」 玩這類遊戲是怎樣的體驗?
如何為Nintendo Switch開發遊戲?
有沒有什麼書籍是介紹製作棋類遊戲AI的?
汽車類遊戲開發中,是遊戲方給汽車廠商付授權費;還是汽車廠商向遊戲方付廣告費?

TAG:遊戲開發 | C | Cocos2d-x | 模板C |