欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從Cocos2d-x2遷移到Cocos2d-x3的過(guò)程分享

 更新時(shí)間:2014年04月28日 10:34:51   作者:  
Cocos2d-x 3.0發(fā)布沒(méi)多久,我就迫不及待地將手頭的一個(gè)習(xí)作嘗試從2.2.2版本遷移到3.0rc0引擎上,本問(wèn)介紹了遷移流程和遇到的問(wèn)題,以及發(fā)現(xiàn)了針對(duì)Android平臺(tái)的變動(dòng),需要的朋友可以參考下

核心代碼遷移相對(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)如下:
    

復(fù)制代碼 代碼如下:
bin/  Classes/  CMakeLists.txt  cocos2d/  proj.android/
      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中,諸如:

復(fù)制代碼 代碼如下:

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打算查看一下究竟:

復(fù)制代碼 代碼如下:

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依賴加上:

復(fù)制代碼 代碼如下:

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é)果如下:

復(fù)制代碼 代碼如下:

/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了:

復(fù)制代碼 代碼如下:

$ 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)文章

最新評(píng)論