2013/01/06

cocos2d-x(2.0.3) 跨平台專案經驗

注意線程安全
不要經pthread開線程(Native code)還使用JNI呼叫Java Code
基本上是線程安全問題
如果這樣做很容易出問題
有遇過下面的狀況
1. 字串被卡掉
2. JNI Call找不到jclass
3. JNI Call找到jclass,但仍然出錯,加上程式是多執行緒,除錯十分困難
基本上後來都採取pthread傳訊息,schedule再處理的模式

map erase 的使用
map的erase方法不會回傳刪除後下一個元素的iterator(vector會)
曾經遇到一個狀況如下
for (itMap = _mapData.begin(); itMap != _mapData.end(); ++itMap)
{
    if (...)
    {
        _mapData.erase(itMap);
    }
}
在某特定狀況移除map中的元素
但這樣的用法是有問題的
在iOS運行正常
但在Android有可能造成無限迴圈

正確的方式應該如下
for (itMap = _mapData.begin(); itMap != _mapData.end(); )
{
    if (...)
    {  //移除
        _mapData.erase(itMap++);
    }
    else
    {  //不移除
        ++itMap;
    }
}


cocos2d-x文字寬度不同平台差異
CCLabalTTF iOS版跟Android版的中文字(字型黑體)在設定相同字型大小時
實際顯示大小有不同
如果設定寬度交由cocos2d-x去斷行基本上沒有什麼問題
但是如果因為文句美觀而自行設定斷行時
就要注意兩平台寬度不同造成顯示效果的不同

Android的CCRenderTexture
這個類別在Android常常出狀況
基本上下面這兩個我都遇到過(2.0.3剛出的時候)
現在看來是都修好了
只是那時候剛換2.0.3的時候真的很慘
不確定何時會修好
就算確定也不能等
所以android用到的部分幾乎都要再另寫一個版本
使用的人在Android版最好多加測試
因為cocos2d-x的開發者也不是能夠測到所有裝置
須仰賴整體社群的幫忙

cocos2d-x 預設libcurl 不支援SSL
cocos2d-x 中有提供libcurl 的這個URL連線程式庫
不過內建的沒有支援ssl
基於專案的需求所以要更換為有SSL功能的
原本想要自己編
不過看了一下官方的建議做法
覺得實在太麻煩
後來發現下面這個網址
https://github.com/dumganhar/libcurl-build
這應該算cocos2d-x官方提供的
可以直接使用

版本號的設定
一開始iOS的版本號設定是以x.x.x這樣的形式去處理的
遊戲移植到android後
由於需要在某些版本快速修正bug後出一個新版本
所以在android有些版本versionName是像x.x.x.y這樣

後來iOS版由於某些原因需要以某版為基礎修正後再出一版
版本號原本是想要跟android一樣
但後來發現iOS版本的專案設定中
版本的設定分為version與build
version的設定只能x.x.x
build則無限制
因為在這個專案中的版本號會影響到一些跟server取資料時的判定
所以版本號需要相同
iOS跳號後android也需要跟進
所以在這一點需要注意


以下後來發現有問題  不建議使用
使用proguard刪除Log訊息
同事提供的方法
在proguard設定中加入下面的設定

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** i(...);
}
詳情可見proguard的網頁
In the optimization step, ProGuard will then remove calls to such methods, if it can determine that the return values aren't used.

所以像Log.i   Log.v這樣的方法是可以用這個設定去移除掉的
採取這個做法的最大好處在於proguard在產出signed的apk檔時才會運作
這樣就不用每次都去刪除或變更變數 


1 則留言 :

匿名 提到...

Good