日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Unity跨iOS、Android平台使用protobuf-net的方法(.Net 2.0)《二》

發布時間:2023/12/20 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity跨iOS、Android平台使用protobuf-net的方法(.Net 2.0)《二》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎加入Unity業內qq交流群:956187480

qq掃描二維碼加群


參考博客:https://blog.csdn.net/qq_37310110/article/details/80529054

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

地址:https://blog.csdn.net/qq_37310110/article/details/80529126

如果只能以.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 提示, 就代表生成成功了。

復制代碼

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

?

?

參考博客:https://blog.csdn.net/qq_37310110/article/details/80529054


歡迎加入Unity業內qq交流群:956187480

qq掃描二維碼加群

總結

以上是生活随笔為你收集整理的Unity跨iOS、Android平台使用protobuf-net的方法(.Net 2.0)《二》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。