gkENGINE跨平台的問題總結


gkENGINE跨平台的心酸血淚史

 

總結了一下去年再作gkENGINE跨平台工作時,遇到的一些坑和解決方案。

開發環境選擇                                                          

 IOS                                                                                                          

IOS支持C++的方式是C++(GCC編譯器)和objC混編

IOS平台使用xcode作為“編譯器”和“調試器”

VisualStudio作為“開發IDE”

利用VMWARE虛擬機,在WIN7環境下開一個MAC虛擬機,一切和IOS真機/虛擬機相關的問題在虛擬機中搞定。

在WIN7下開一個代碼托管倉庫,VMWARE橋接網絡可以在MAC OS里pull代碼。

 ANDROID                                                                     

ANDROID支持C++的方式是NDK。Android2.3之后支持純原生代碼。

NDK的官方開發流是geek范兒:手寫mk文件,調用windows版的gcc編譯器直接編譯出可在arm架構上跑的二進制。然后使用gdb server進行真機調試。

可以通過vs-android方案,將手寫mk文件的步驟,變為熟悉的vs管理工程。通過MSBuild擴展出一個Android平台(對應WIN32/WIN64)編譯選項。同時配合Android-SDK和ANT,可以直接生成用於真機安裝的APK包。

參考工程                                                   

COCOS2D-X

POWERVR SDK

跨平台不得不改的幾個模塊                      

渲染API                                                                          

l  D3D是用不了的,需要使用GLES2來實現渲染器

輸入                                                                               

l  輸入方式和WINDOWS是完全不同的,觸屏VS鍵鼠

l  IOS和ANDROID的輸入消息驅動方式也有區別,需要分別實現

操作系統打交道的                                                         

l  線程API,Linux可以用pthread

l  各種數據類型定義, 通過DEFINE的轉

l  WIN API,一部分WIN API可以用LINUX平台的函數封裝

GCC和MSVC編譯器不同的脾氣                                    

l  模板

l  傳參行為

l  編譯器特性和關鍵字_stdcall _fastcall等等

l  switch case只支持8位... 被坑慘了

UNICODE和MULTIBYTE                                               

l  NDK 7對UNICODE支持不好,最終選擇了MULTIBYTE

WINDOWS的專有庫                                                    

l  ATL, MFC… gkENGINE還好都沒有選用

l  各種第三方庫,有源碼的可以嘗試編譯跨平台(rapidXML等等)

庫的封裝                                                                      

ANDROID支持動態鏈接(.so)

IOS鎖死了動態鏈接,只能使用靜態鏈接(.a)

資源引用                                                                     

IOS需要把文件按目錄結構打進APP包中,用一個obj系統提供的bundle路徑來作為root路徑引用文件

ANDROID的數據可以類似IOS一樣,統一打進APK包中。安裝后直接位於APK程序位置。也可以放置於SD卡中,索引SDCARD路徑的方法可能會根據機型有不同。

文件系統                                                                     

IOS真機的文件系統式HFS+,該文件系統對文件名是大小寫敏感的! 而MAC OS可以是HFS,大小寫不敏感。這是一個大坑。資源和路徑可能需要全部處理為小寫。

LINUX系統不支持“\”作為路徑分割,因此在路徑索引和源代碼中,一律要使用“/”。

 

渲染器                                                    

渲染器需要使用openGL ES/ES2來實現。

在WINDOWS平台上可使用POWERVR SDK提供的GLES2模擬庫來模擬,該庫是對OPENGL的封裝。COCOS2D-X也使用這種方式。使用WINDOWS模擬器的最大優勢在於, 可以脫離於移動平台,直接在WINDOWS平台下開發。在發布里程碑版本時再針對移動平台編譯,解決部分問題。提高開發和調試效率。

在ANDROID和IOS中,OPENGLES2的行為還稍顯不同。

C標准庫和C++標准庫                               

在移動平台上,對這兩個標准庫都支持得很好。因此如果之前的工程如果大量的使用標准庫函數和對象來開發,跨平台時可以事半功倍。

規格                                                        

移動平台的內存偏小,這一點需要十分注意。容易爆內存崩潰。

移動平台顯卡支持的硬件解碼紋理格式各異:

ETC :所有廠商支持 | 不支持ALPHA通道

PVR :POWERVR | ALPHA通道支持很爛

DDS : NVIDIA

AT2:  高通


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM