Cocos2dx3.10遊戲移植到Windows平臺遇到的坑總結
前言:由於公司專案需要將Cocos2dx遊戲移植到Windows平臺,之前一直只是移植IOS和Android,第一次嘗試移植到Windows平臺,並且使用到JNI呼叫第三方SDK的jar包,因此遇到無數的坑,這裡做一個總結!(完全是小白摸索之路啊。。。)
PS:引擎原始碼使用的Cocos2dx3.10,作業系統win7 64位, VS2013,jdk 1.7 32位
一、Cocos2dx工程檔案太大,在Windows上使用sourceTree裡check不下來?(第一次用windows版的sourcetree,不知道是軟體問題還是配置問題,卡到爆,砸電腦的心都有)
在Cocos2dx專案中包含了各個平臺的工程目錄,移植到過平臺之後都會編譯生成對應平臺相關的檔案,導致整個專案資料夾內容越來越大,在windows平臺上就很難將專案check下來。因此提交程式碼的時候最好只提交程式碼和資源以及最簡單的工程配置檔案,而不要提交編譯後自動生成的資料夾,(比如Android studio工程中gen目錄、bin目錄已經生成的.so動態庫;windows工程目錄下編譯生成的Debug.win32和Release.win32資料夾已經log日誌檔案等),這些檔案都可以在重新編譯後自動生成,且非常大,一般都是一兩個G,完全沒必要。
二、中文編碼問題?
先編譯生成一遍win32工程,有中文的檔案會提示編碼錯誤,將檔案在“高階選項設定”中儲存為UTF-8帶簽名模式。如果程式碼中使用到中文了,出現中文亂碼的問題,可以考慮使用XML檔案配置後,在程式碼中讀取,這個問題網上教程很多!這樣也方便實現國際化。
PS:1、在XML檔案中配置的中文如果帶有空格,在Windows中顯示出來會比在IOS和Android中要寬一半。
2、不建議在程式碼中使用中文註釋,有時候會出現有中文註釋的下一行程式碼沒有執行,這種莫名其妙的錯誤很坑,又不會明顯報錯,表面看上去沒有任何問題;將中文註釋刪除,再次執行就可以了。
3、如果將XCode工程生成的原始檔移植到windows平臺,改了編碼格式之後,中文就能正常顯示;但是在windows平臺下開發新建的檔案預設儲存格式為簡體中文,再移植到XCode中,中文就會顯示一串亂碼。所以如果全用英文,就不存在這種問題了。
三、使用到JNI呼叫第三方的SDK jar包,無法例項化JVM?
首先確定JDK環境配置是否正確。如果你最終要打包生成.exe可執行檔案,那麼程式碼和工程中配置就不能使用絕對路徑了。
四、使用JNI後回撥到Cocos2dx中執行邏輯,遊戲圖片紋理變成黑色或者crash ?
問題描述:1、如果在回撥中執行了改變精靈紋理的操作,那麼紋理會變成黑色。
2、如果在回撥中執行了幀動畫,遊戲crash。
原因:jni回調回來是在子執行緒中執行的,但是opengl es的API不是執行緒安全的,因此只能保證在cocos主執行緒中執行才是安全的。如果回撥中使用到紋理等操作,就要想辦法將這段處理邏輯轉到主執行緒中去執行。這裡剛開始接觸cocos 多執行緒時,就走了彎路! 開始為了方便,直接將邏輯放在CallFunc::create()方法中,用action包裝一下,當做一個p普通的actiton物件使用,開始的時候感覺很正常。但是後面發現,程式偶爾會crash到原始碼中ActionManager類的update方法裡,在遍歷節點的actions時會出異常。看註釋:
// The 'actions' MutableArray may change while inside this loop. 提示很明顯,jni回撥觸發的時機不確定,在遍歷的過程中actions有改動,但是也不是100%會觸發,而且概率相對還很小。 因此這種方法治標不治本,走了彎路。最後再閱讀引擎原始碼HttpClient類時,瞭解原始碼中的多執行緒處理方式後,就發現了一個Schedule類中有這麼一個方法:
voidScheduler::performFunctionInCocosThread(conststd::function<void ()> &function),看這貨的名字就知道,就是專門往cocos主執行緒中插入用的。具體使用流程可參考HttpClient類
五、如何監聽遊戲退出?
如果想在遊戲退出之後,做一些資源清理工作,做必須要監聽程式退出,在網上搜了好久,也沒怎麼看明白!(主要是對Windows上開發win32程式不熟悉)。通過跟蹤遊戲主迴圈執行的邏輯,我發現在main函式中可以簡單實現。(不知道會不會有什麼後遺症,但是貌似適用我的專案需求)
六、移植到XP系統?
很遺憾,沒有移植成功!放棄了!!!
XP系統最高只支援VS2010,而Cocos2dx3.x開始官方就不測試XP系統了,並且v3.x版本使用了C++11新特性,至少要使用VS2012(部分支援)。看懂了吧!還沒開始測試我就選擇了放棄,坑太多。。。
七、打包釋出?
由於專案中使用到了jni呼叫第三方SDK jar包,因此也給打包帶來了困難,關鍵就是jdk環境怎麼打包,如果搞定了這個問題,打包就很簡單了,網上隨便找篇文件照做就是了,這裡只記錄怎麼配置jdk環境,詳細步驟之前已經寫在這裡了:http://blog.csdn.net/u013058216/article/details/53028862 ,問題三中也提到了
八、VS開發中有音效,打包之後沒有音效?
問題描述:開始遇到這個問題的時候感覺很神奇,在VS中是有聲音的,在Debug.win32或者Release.win32中也有聲音,但是打包之後就沒有聲音了。原來是在打包的時候,將所有需要被打包的檔案和資源拷貝到一個空資料夾中的時候,這個資料夾是以中文命名的,改成英文就好了。切記這裡不能以中文命名資料夾!