從Cocos2d-x2遷移到Cocos2d-x3的過(guò)程分享
核心代碼遷移相對(duì)順利,大致流程如下:
一、創(chuàng)建項(xiàng)目
1) cd cocos2d-x-3.0rc0;
2) 執(zhí)行setup.py,設(shè)置引擎依賴的環(huán)境變量,腳本會(huì)將COCOS_CONSOLE_ROOT和ANT_ROOT寫入到~/.bash_profile中; 執(zhí)行source ~/.bash_profile使得環(huán)境變量生效;
3) 在cocos2d-x-3.0rc0下建立projects目錄;
4) 利用cocos2d-console工具建立新項(xiàng)目: cocos new GameDemo -p com.tonybai.game.gamedemo -l cpp -d ./projects
5) cd ./projects/GameDemo,我們可以看到項(xiàng)目目錄結(jié)構(gòu)如下:
proj.ios_mac/ proj.linux/ proj.win32/ Resources/
6) 執(zhí)行cocos compile -p android -j 4 –ap 19 -m release,這個(gè)Demo的apk就會(huì)被生成,大致就是一個(gè)cpp-empty-test;
二、 代碼移植
代碼移植的主要工作包括:
1) 改名
帶有CC前綴的類名大都要將前綴去掉;
各主要類的單例方法sharedXXXX都改為getInstance;
2) 菜單、按鈕事件處理
由menu_selector(GameScene::menuStartCallback) 改為CC_CALLBACK_1(GameScene::menuStartCallback, this);
3) 觸屏事件處理
在Cocos2d-x 2.2.2中,我們直接使用Layer的setTouchEnabled(true),并Override 三個(gè)觸屏事件處理函數(shù);
在新版引擎中,我們需要建立事件Listener,并將Listener注冊(cè)到全局EventDispatcher中,諸如:
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded, this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
然后將這里的三個(gè)事件處理方法實(shí)現(xiàn)出來(lái)即可。
核心功能遷移后,GameDemo在genymotion 4.4 Android模擬器以及真機(jī)上都能正常運(yùn)行,在模擬器上能保持40左右的幀率,在真機(jī)上幀率一直在60左右。玩了一會(huì)后,感覺(jué)引擎渲染性能的確有提升, 而且這種提升是可以在真機(jī)上直觀感受到的。
不過(guò)好景不長(zhǎng),我又嘗試將GameDemo在genymotion 2.3.7 Android上運(yùn)行,這回得到的結(jié)果卻是:黑屏。 又將Cocos2d-x 3.0rc0自帶的cpp-empty-test編譯后放到模擬器上運(yùn)行,得到了同樣的黑屏結(jié)果,顯然這可能是rc0的一個(gè)問(wèn)題。在Cocos2d-x forum上粗略搜到的結(jié)果是:升級(jí)到最新版本可以解決黑屏問(wèn)題。于是到官方下載目前最新發(fā)布版Cocos2d-x 3.0rc2。這里也吐槽一下:cocos2d-x引擎包Size太大了,似乎也沒(méi)有提供什么patch文件,導(dǎo)致每發(fā)一個(gè)版本都要下載幾百M(fèi)的包。官方 git repository也太大了,嘗試clone了幾次都失敗了,最終還只能下載源碼的zip包。
Cocos2d-x 3.0rc2下載解壓后,先編譯了一下cpp-empty-test,然后部署到Android 2.3.7上運(yùn)行,這回“黑屏”的確不見了,看來(lái)rc2修正了這個(gè)問(wèn)題。接下來(lái)就是將我的GameDemo移植到rc2上了。
我用解壓后的“cocos2d-x 3.0rc2”替換GameDemo下的cocos2d,然后運(yùn)行cocos compile編譯,install到模擬器行運(yùn)行,程序啟動(dòng)失敗,從monitor logcat中看到一行錯(cuò)誤日志:
“ANativeActivity_onCreate not found”
怎么會(huì)呢?ANativeActivity_onCreate是由NDK的 native_app_glue static library提供的,怎么會(huì)找不到呢?
于是乎打開GameDemo/cocos2d/cocos/2d/platform/android/Android.mk打算查看一下究竟:
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_png_static cocos_jpeg_static cocos_tiff_static cocos_webp_static
include $(BUILD_STATIC_LIBRARY)
$(call import-module,jpeg/prebuilt/android)
$(call import-module,png/prebuilt/android)
$(call import-module,tiff/prebuilt/android)
$(call import-module,webp/prebuilt/android)
Android.mk內(nèi)容中居然沒(méi)有將native_app_glue列入,又翻看了一下cocos2d-x 3.0rc0中的同位置Android.mk,后者是有native_app_glue的庫(kù)依賴的。難道是rc2這塊忘記了?于是我嘗試將 native_app_glue依賴加上:
LOCAL_WHOLE_STATIC_LIBRARIES := android_native_app_glue cocos_png_static cocos_jpeg_static cocos_tiff_static cocos_webp_static
include $(BUILD_STATIC_LIBRARY)
$(call import-module,jpeg/prebuilt/android)
$(call import-module,png/prebuilt/android)
$(call import-module,tiff/prebuilt/android)
$(call import-module,webp/prebuilt/android)
$(call import-module,android/native_app_glue)
再次嘗試編譯,不過(guò)這次連編譯都沒(méi)能通過(guò),錯(cuò)誤的build結(jié)果如下:
/home1/tonybai/android-dev/adt-bundle-linux-x86_64/android-ndk-r9c/sources/android/native_app_glue/android_native_app_glue.c:232: error: undefined reference to 'android_main'
collect2: error: ld returned 1 exit status
make: *** [obj/local/armeabi/libgamedemo.so] Error 1
從結(jié)果來(lái)看,鏈接器沒(méi)能找到native_app_glue中android_main對(duì) 應(yīng)的函數(shù)體定義。android_main可是cocos2d-x 3.0引擎提供的實(shí)現(xiàn)啊。于是乎再次進(jìn)入到rc2引擎代碼中查找原因,結(jié)果卻讓我很是吃驚:“NativeActivity被引擎移除了”!cocos2d/cocos/2d/platform /android目錄下面已經(jīng)沒(méi)有了nativeactivity.h和nativeactivity.cpp了:
$ ls -F cocos2d/cocos/2d/platform/android
Android.mk CCApplication.h CCDevice.cpp CCFileUtilsAndroid.h CCGLView.cpp CCPlatformDefine.h java/ jni/
CCApplication.cpp CCCommon.cpp CCFileUtilsAndroid.cpp CCGL.h CCGLView.h CCStdC.h javaactivity.cpp
我們看到了一個(gè)新文件:javaactivity.cpp,打開該文件,我們發(fā)現(xiàn)了和cocos2d-x 2.2.2版本類似的名字:Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit。難道rc2針對(duì) Android平臺(tái)的引擎入口代碼回退到2.x版本的設(shè)計(jì)了?于是乎趕緊進(jìn)到/cocos2d/cocos/2d/platform/android/java/src/org/cocos2dx/lib目 錄下一看究竟。
果不其然,一切看起來(lái)都那么的熟悉:Cocos2dxActivity.java、Cocos2dxGLSurfaceView.java、 Cocos2dxRenderer.java….。自此可以斷定,rc2中Android平臺(tái)的引擎設(shè)計(jì)退回到了2.x版:
– 你的GameActivity要集成Cocos2dxActivity;
– mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer())時(shí),GLThread(渲染線程)誕生
– 死循環(huán)調(diào)用Cocos2dxRenderer.onDrawFrame
– 引擎邏輯就在Cocos2dxRenderer.onDrawFrame中被執(zhí)行。
回到了2.2.2版本設(shè)計(jì)的引擎在性能上是否會(huì)像rc0那樣給人以直觀提升的感覺(jué)呢,即便渲染器是新寫的?真機(jī)測(cè)試的結(jié)果表明,沒(méi)有直觀感覺(jué)到提 升。難道是Native Thread(pthread_create創(chuàng)建)和Java Thread之間的差別?不得而知,后續(xù)慢慢體會(huì)吧。
另外要提一句:javaactivity.cpp將以往2.2.2版本放在項(xiàng)目jni中的 Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit挪到了引擎中,本來(lái)就是基本不變的代碼, 放在引擎中的確更好。rc2的設(shè)計(jì)回歸也有一定好處,一是以前對(duì)引擎的認(rèn)識(shí)還適用,二呢就是適合集成在2.2.2版本中的第三方工具的方法應(yīng)該同樣適合3.0rc2版本,這樣移 植成本估計(jì)會(huì)小些。這樣我們針對(duì)新的3.0引擎,重點(diǎn)還是去關(guān)注渲染器、事件分發(fā)機(jī)制以及物理引擎的變化吧。
事實(shí)上NativeActivity是在rc1就被移除了,這種較大的改動(dòng)讓人始料不急。這么大的改動(dòng),這么短時(shí)間發(fā)布,讓人對(duì)目前的 3.0引擎,至少是Android版本引擎的質(zhì)量表示些許擔(dān)憂啊。不知道3.0正式版中這塊的代碼會(huì)變啥樣,拭目以待吧。
BTW,rc2版本cpp-empty-test在Android 2.3.7模擬器上的幀數(shù)在10幀以下,我的Demo也只有5幀,而在4.4版本模擬器上,可以達(dá)到40幀,還好還好。
相關(guān)文章
搭建簡(jiǎn)易藍(lán)牙定位系統(tǒng)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇搭建簡(jiǎn)易藍(lán)牙定位系統(tǒng)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Android APP開發(fā)KML軌跡導(dǎo)出教程示例
這篇文章主要為大家介紹了Android APP開發(fā)KML軌跡導(dǎo)出教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android使用FontMetrics對(duì)象計(jì)算位置坐標(biāo)
這篇文章主要為大家詳細(xì)介紹了Android使用FontMetrics對(duì)象計(jì)算位置坐標(biāo),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android popupWindow彈出窗體實(shí)現(xiàn)方法分析
這篇文章主要介紹了Android popupWindow彈出窗體實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了Android彈出窗體的布局及popupwindow屬性設(shè)置、事件監(jiān)聽相關(guān)操作技巧,需要的朋友可以參考下2017-07-07Android使用OkHttp進(jìn)行重定向攔截處理的方法
這篇文章主要介紹了Android使用OkHttp進(jìn)行重定向攔截處理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08談?wù)凙ndroid Fragments 詳細(xì)使用
本篇文章主要介紹了Android Fragments 詳細(xì)使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Android開發(fā)TextvView實(shí)現(xiàn)鏤空字體效果示例代碼
這篇文章主要介紹了Android開發(fā)TextvView實(shí)現(xiàn)鏤空字體效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Android開發(fā)之Notification通知用法詳解
這篇文章主要介紹了Android開發(fā)之Notification通知用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Notification通知的功能、參數(shù)、定義及使用方法,需要的朋友可以參考下2016-11-11android開發(fā)教程之ubuntu使用adb連接小米2的步驟和adb調(diào)試方法
這篇文章主要介紹了ubuntu中使用adb連接小米2的步驟和adb調(diào)試方法,需要的朋友可以參考下2014-02-02