在ios android裝置上使用 Protobuf (使用dll方式)

來源:互聯網
上載者:User

標籤:

http://game.ceeger.com/forum/read.php?tid=13479

 

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

地址:http://game.ceeger.com/forum/read.php?tid=14359&fid=27

 

 

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

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

 

 

 

 

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

 

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

以及 網路通訊協定的傳輸 等等。

 

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

http://code.google.com/p/protobuf/

https://developers.google.com/protocol-buffers/docs/tutorials

 

 

Unity有兩個Protobuf庫可以用分別是 protobuf-csharp-port, protobuf-net (後者效率更高)

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

 

ExecutionEngineException:

Attempting to JIT compile method

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

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

JIT:http://en.wikipedia.org/wiki/Just-in-time_compilation

AOT:http://en.wikipedia.org/wiki/AOT_compiler

http://www.mono-project.com/AOT

 

 

 

 

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

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

 

 

 

 

一、 下載protobuf-net 及配置

 到http://code.google.com/p/protobuf-net/downloads/list 去下載protobuf-net最新發行版本(寫這篇教程的時候最新版本是r668)

 下載之後解壓到你的硬碟的某個目錄 , 最好是將 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 提示, 就代表產生成功了。

 

 


複製代碼

12345678910 D:\protobuf-net\Precompile\Model>precompile TestModel.dll -o:ProtobufSerializer.dll -t:com.fbmly.ProtobufSerializerprotobuf-net pre-compilerDetected framework: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727Resolved C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dllResolved C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dllResolved protobuf-net.dllAdding Fbmly1.Fbmly...Compiling com.fbmly.ProtobufSerializer to ProtobufSerializer.dll...All done

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

五、在unity中測試

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

現在可以開始測試了

 

測試代碼:

 

 


複製代碼

123456789101112131415161718192021222324252627 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都可用。

 

 

最後附上工程包:裡面附了一個工具類,可以序列化的時候使用, 用的時候只需要修改一下就可以了,因為裡面維護了一個序列化類別的單例。

在ios android裝置上使用 Protobuf (使用dll方式)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.