1. 程式人生 > >Unity跨iOS、Android平臺使用protobuf-net的方法

Unity跨iOS、Android平臺使用protobuf-net的方法

如果你的工程可以以.Net 2.0 subset模式執行,請看這個帖子中的方法。

如果只能以.Net 2.0下執行,就可以繼續往下看了。

=============================================================

protobufgoogle定製的一個協議,可以方便地進行資料的序列化和反序列操作。(支援多個平臺間通訊)

可以用它來進行資料的本地快取

以及 網路協議的傳輸 等等。

要了解protobuf協議看下面兩個網址:

Unity有兩個Protobuf庫可以用分別是 protobuf-csharp-port, protobuf-net

 (後者效率更高)

兩個庫使用都可以在android上執行正常,但是在ios上面會出現下面的異常:

ExecutionEngineException:

Attempting to JIT compile method

JIT意思就是執行時編譯,而ios上是aot (full)編譯,因此任何庫只要使用jit方式都無法在ios上執行。

要了解jit以及aot,請看下面的網址:

經過嘗試之後,可以用protobuf-net的預編譯來在ios以及android裝置上執行

接下來按步驟講解,最後會附上測試工程。

一、 下載protobuf-net 及配置

 下載之後解壓到你的硬碟的某個目錄 , 最好是將 Precompile\precompile.exe

 以及 ProtoGen\protogen.exe 兩個檔案加入到環境變數中 , 之後方便使用。

 我們還需要CoreOnly\ios中的三個檔案,之後會用到,而且最終會放到unity工程下。

二、生成cs程式碼

 使用protogen 命令列來生成程式碼 (precompile以及protogen都只能在windows下執行,在mac上可能可以通過mono來執行這個exe,但是沒有試過。)

使用例子如下

 protogen -i:Test1.proto -i:Test2.proto -i:Test3.proto -o:Output.cs -ns:com.fbmly.model

-i 是輸入檔案,可以有多個

-o 輸出的cs檔案, 只能有一個..如果-i有多個 會將所有的程式碼生成到這一個cs檔案當中

-ns 名稱空間   最好使用,如果不使用每次生成的預設名稱空間是proto的檔名。

通常來說 只要把所有的資料結構生成到一個cs就行了(要不然使用多個-i , 要不就把所有protobuf定義寫在一個proto檔案中),這樣之後之後操作比較方便一些。

經過這一步你就得到了生成之後的cs檔案。

三、編譯dll庫

使用MonoDevelop工具 將上一步生成的cs檔案編譯成dll庫.

1.建立一個新的工程 (File->New->Solution)

2.在彈出的對話方塊中選擇 C# 再選擇 Library.

3.在下方填寫好工程的名字 (這個名字是生成dll的名字,所以要起好)

4.點選forward (之後還要點一次ok)

5.刪掉預設生成的MyClass.cs檔案,有必要的話在AssemblyInfo.cs裡填寫一些版權資訊。

6.將上一步用protogen生成的cs檔案 加入到工程 (在左邊工程名 上右鍵 就可以新增)

7.新增protobuf-net引用庫

   點選工程的References->Edit References

   然後選擇剛才的CoreOnly\ios下的dll庫 , 雙擊庫檔案就可以加到右邊

   最後檢查下References裡面如果有protobuf-net.dll就正確了。

8.都做好後, 點選Build->Build All就可以在當前工程生成dll了

   不要忘記 debug 和 release的選擇 ,測試完後應該重新拿release再編譯一次的。

9. 左下角提示成功 就 會在當前工程目錄下生成dll檔案了 (我這裡是 TestModel.dll)

這個dll存放的是你所有的資料結構。

四、預編譯序列化庫

 上一步生成了資料的dll檔案,這一步需要用到上一步的dll檔案來生成專門序列化的dll檔案。

 首先要保證TestModel.dll和編譯時所使用的庫在同一目錄 ( 上一步生成的dll檔案目錄,會自動把protobuf-net庫檔案也複製過來 , 所以只需要記住這一點就行了。 比如你要是複製到其他目錄進行操作, 這點會很重要 )

然後開啟命令列, 定位到dll工程目錄下的bin\Debug 或 bin\Release目錄

然後執行以下命令(修改成你所設定的名字):

precompile TestModel.dll -o:ProtobufSerializer.dll -t:com.fbmly.ProtobufSerializer

TestModel.dll就是上一步生成的dll檔案,-o是生成的檔名  -t是在ProtobufSerialize.dll中所生成的序列化類的類名 支援名稱空間,不用名稱空間就直接寫類名就可以了。

 如果最後有 All Done 提示, 就代表生成成功了。


複製程式碼
1 2 3 4 5 6 7 8 9 10 D:\protobuf-net\Precompile\Model>precompile TestModel.dll -o:ProtobufSerializer. dll -t:com.fbmly.ProtobufSerializer protobuf-net pre-compiler Detected framework: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 Resolved C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll Resolved C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll Resolved protobuf-net.dll Adding Fbmly1.Fbmly... Compiling com.fbmly.ProtobufSerializer to ProtobufSerializer.dll... All done

五、在unity中測試

將第三步和第四步中生成的 TestModel.dll ,ProtobufSerializer.dll 以及參與編譯的protobuf-net庫   複製到unity的工程中去。

現在可以開始測試了

測試程式碼:


複製程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 void OnGUI( ) { if ( GUILayout.Button ( "Test" , GUILayout.Width ( 200f ) , GUILayout.Height ( 200f ) ) ) { Fbmly data = new Fbmly ( ); data.mmm = 10; ProtobufSerializer serializer = new ProtobufSerializer ( ); //Serialize byte[] buffer = null; using ( MemoryStream m = new MemoryStream ( ) ) { serializer.Serialize ( m , data ); m.Position = 0; int length = (int)m.Length; buffer = new byte[length]; m.Read(buffer, 0 ,length); } Fbmly newData = null; //Deserialize using ( MemoryStream m = new MemoryStream ( buffer ) ) { newData = serializer.Deserialize ( m , null typeof ( Fbmly ) ) as Fbmly; } Debug.Log ( "newData.mmm=" + newData.mmm ); } }

測試工程已經在touch4上測試通過,並且工程設定為.Net 2.0 Subset

如果各位在真機上出現錯誤,不妨設定到.Net 2.0試試。

這種方式已經在遊戲專案中驗證過了,複雜的資料也是沒有問題的(遊戲專案用了500多個proto定義) , ios和android都可用。

相關推薦

UnityiOSAndroid平臺使用protobuf-net方法

如果你的工程可以以.Net 2.0 subset模式執行,請看這個帖子中的方法。 如果只能以.Net 2.0下執行,就可以繼續往下看了。 ============================================================= protobuf是goo

uni-app 是一個使用 Vue.js 開發跨平臺應用的前端框架,開發者編寫一套程式碼,可編譯到iOSAndroid微信小程式等多個平臺

uni-app 是一個使用 Vue.js 開發跨平臺應用的前端框架,開發者編寫一套程式碼,可編譯到iOS、Android、微信小程式等多個平臺。 uni-app在跨端數量、擴充套件能力、效能體

H5跟iosandroid數據對接

itl 獲取 os x doc char body round lan ttr 需求:   APP要用H5頁面做展示,而且要獲取到對應的商品ID,用戶點擊H5頁面跳回APP原生頁面。 方法:   先要判斷用戶是ios還是android設備(這裏只考慮ios跟android,

Xamarin.Forms 開發IOSAndroidUWP應用

windows 開發項目 alt ive 快速 需要 預覽 開發 aml C#語言特點,簡單、快速、高效。本次我們通過C#以及Xaml來做移動開發。 1.開發工具visual studio 2015或visual studio 2017。當然visual studio 20

移動端H5 判斷IOS還是Android 平臺

hone one 平臺 useragent ont navig navigator span ios 1.方法 (function($) { var UA = window.navigator.userAgent; if(/Android|HTC/i.te

官方揭秘!同時兼容iOSAndroid微信小程序的UI引擎

控制 com gpo 配置 rect 定義 init .so pos 在應用開發過程中,一些效果使用純前端h5實現體驗比較差,為此開發者會選擇相應的原生UI模塊來替代,原生模塊性能和體驗好,但目前存在的一個問題就是界面可定制性比較差,不能百分百滿足需求。為此,結合原生模塊的

js通過UA判斷iosandroid微信qqqq瀏覽器

function isIPhone(){ //判斷是否是ios var u = navigator.userAgent; var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端 return is

適用於 iOSAndroid 和 Windows 裝置的移動裝置管理

適用於 iOS、Android 和 Windows 裝置的移動裝置管理   隨著企業環境中移動裝置的數量不斷增加,詳細檢查訪問您企業資源的移動裝置變得至關重要。統一終端管理軟體 Desktop Central 可幫助您從一箇中心位置配置和保護您的移動裝置,其專為簡化桌面和移動裝置管理而生。

適用於 iOSAndroid 和 Windows 設備的移動設備管理

員工 本地 設備管理 ××× 用戶 dev 環境 任務管理 狀態 適用於 iOS、Android 和 Windows 設備的移動設備管理 隨著企業環境中移動設備的數量不斷增加,詳細檢查訪問您企業資源的移動設備變得至關重要。統一終端管理軟件 Desktop Central 可

同時相容iOSAndroid微信小程式的UI引擎

在應用開發過程中,一些效果使用純前端h5實現體驗比較差,為此開發者會選擇相應的原生UI模組來替代,原生模組效能和體驗好,但目前存在的一個問題就是介面可定製性比較差,不能百分百滿足需求。為此,結合原生模組的效能和體驗以及前端開發的靈活性,APICloud推出了純翻譯模式的UI引擎。 注: 純翻譯模式的UI引擎

uni-app 1.2釋出,iOSAndroid小程式H5主流四端全覆蓋

多端氾濫、精力有限,是很多前端開發者每日的夢魘。 uni-app遵循Vue.js語法規範,一套程式碼,多端發行,切實解決了眾多開發者的痛點; 故自8月份釋出以來,已有上萬名開發人員擁抱uni-app,目前已累計建立了數萬個應用,活躍的開發者們每天在QQ群中產生數萬條交流記錄。 奔跑的腳步不會停止,歷時一

移動端證件識別支持iosandroid

影響 -o 規則 平板電腦 ima 支持 校正 term 文字 應用背景 移動端證件是別是基於移動平臺的證件識別應用程序,支持Android、iOS等多種主流移動操作系統。該產品采用手機、平板電腦攝像頭拍攝證件圖像,然後通過OCR軟件對證件信息進行識別提取。 特色功能 支持

2018年10月親測-免費科學上網工具分享-適用WindowsIOSAndroid等系統

工具簡介 最近想到外面上網看看新聞推特和其他,就在尋找合適的、免費的上網工具,經過幾個軟體的試用,最終鎖定Baacloud,在這裡分享給大家。首先強調下面需要注意的三點: Baacloud軟體提供限量的免費流量(每個月約7G左右),所以只能供自己看新聞及短視

2018年10月親測-免費上網工具分享-適用WindowsIOSAndroid等系統

工具簡介 最近想到外面上網看看新聞推特和其他,就在尋找合適的、免費上網工具,經過幾個軟體的試用,最終鎖定Baacloud,在這裡分享給大家。首先強調下面需要注意的三點: Baacloud軟體提供限量的免費流量(每個月約7G左右),所以只能供自己看新聞及短視訊

基於DLNA實現iOSAndroid投屏:基本概念

基礎概念 DLNA DLNA的全稱是DIGITAL LIVING NETWORK ALLIANCE(數字生活網路聯盟), 其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA(Digital Liv

微信小程式區別iosandroid平臺的方式

具體方式如下: const that = this; wx.getSystemInfo({ success(res) { if (res.platform == "ios")

關注IOSAndroid網路音視訊編解碼特效Neon演算法優化,DSP等嵌入式驅動開發演算法移植

(1)音訊格式:典型WAV 封裝格式是每個音訊檔案必不可少的組成部分之一,它給我們提供了以下參考資訊。音訊檔案型別、編解碼方法、單雙聲道、取樣深度、取樣率、量化位數、音訊檔案大小、長度。下面首先來分析一下經典的wav音訊的封裝格式。個人精力有限不可能把每種音視訊格式都一一解

Unity使用NDK在Android平臺上引用C++程式碼的so檔案(下)

由於最近進入了公司,手頭上的工作需要一點一點的去適應,所以沒有空來完成接下來的博文,今天突然想到寫一些,發現這麼久沒有接觸了,好像已經忘記了很多,寫下這個博文,我也正好回顧一個這一方面的知識。 關於在unity上使用C++的程式碼需要用到SO檔案了,這就像Cocos上使用C

UnityIOSAndroid安裝包大小優化

簡介 蘋果對於IOS執行檔的大小是有明確的限制的,其中TEXT段的大小不能超過80M,否則提審將會被蘋果拒絕,同時,如果TEXT段過於太大,那麼在蘋果進行加密之後,很容易出現解壓失敗等各種異常,最終導致遊戲無法正常執行。因此,理論上我們應該儘可能保持我們的執行檔TEX