(轉)在ios android設備上使用 Protobuf (使用dll方式)

自: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下運行,就可以繼續往下看了。

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

?

?

?

?

protobufgoogle定制的一個協議,可以方便地進行數據的序列化和反序列操作。(支持多個平臺間通信)

?

可以用它來進行數據的本地緩存

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

?

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

?

?

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

ProtobufTest.unitypackage

?

?

??或者在這里下載:

??http://pan.ceeger.com/viewfile.php?file_id=1824

轉載于:https://www.cnblogs.com/wonderKK/p/3969712.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259945.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259945.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259945.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ps 毛發 邊緣_Adobe Photoshop摳圖技巧/摳圖后頭發邊緣的顏色處理方法教程!

PS教學第11期摳圖技巧和摳圖后的頭發邊緣的顏色處理的解釋本篇摳圖技巧教程除了跟大家分享了摳頭發的方法外,還分享如何解決摳頭發后頭發周圍的異色,如白邊紫邊等問題。教程作者沒有提供素材,大家可以找其他圖片來練習。有些時候想…

計算機運維知識點,系統運維必會知識點

1 刪除文件的原理文件刪除:需要具備以下兩個條件同時具備才生效1受文件的硬連接控制,有一個硬連接i_link1,減少一個硬連接,i_link-1,當i_link0時,文件就被刪了列:創建文件i_link1,為這個文件創建一個硬連接&#xff0c…

Hyper-v 2016 VHD Set

Hyper-v 2016 VHD Set微軟在Windows Server 2016 Hyper-v中新增了一種磁盤類型--“VHD集”,和以前版本的共享VHD類似,這種類型的磁盤能夠在多個服務器之間共享來實現來賓群集。看到這里相信有很多熟悉Hyper-v的朋友會問:這和以前的 Share VHD…

【總有一些東西要弄清】——說說面試時一系列的CSS問題

僅以此篇緬懷那些筆試100次,問100次的CSS問題。 問: CSS選擇符有哪些?哪些屬性可以繼承?優先級?內聯和important哪個優先級高? 選擇符 1通配選擇符(*)表示頁面內所有元素的樣式*{fon…

面試總結之html+css

最近面試了一些公司,和技術總監聊了一些前端技術方面的內容。回來之后我總結了一下,大致可以分為三個模塊:第一、Html與css 方面;第二、瀏覽器解析方面;第三、js方面。打算,分為三篇博文,根據自…

k8s部署tomcat及web應用_k8s部署tomcat的yaml文件

1、k8s部署tomcat的yaml文件apiVersion: apps/v1kind: Deploymentmetadata:name: mytomcatspec:replicas: 5selector:matchLabels:app: mytomcatminReadySeconds: 1progressDeadlineSeconds: 60revisionHistoryLimit: 5strategy:type: RollingUpdaterollingUpdate:maxSurge: 1m…

計算機的發展經歷階段應用領域,計算機的發展階段

計算機的發展階段以下文字資料是由(歷史新知網www.lishixinzhi.com)小編為大家搜集整理后發布的內容,讓我們趕快一起來看一下吧!計算機經歷了四個發展階段。1、電子管數字機(1946—1958年)硬件方面,邏輯元件采用的是真空電子管,外…

全球都對HTTPS拋出了橄欖枝,為什么?你又該怎么辦?

2019獨角獸企業重金招聘Python工程師標準>>> 互聯網發展20多年,大家都習慣了在瀏覽器地址里輸入HTTP格式的網址。但前兩年,HTTPS逐漸取代HTTP,成為傳輸協議界的“新寵”。 早在2014年,由網際網路安全研究組織Internet …

jqGrid格式化日期

colModel列中屬性 formatter:date, formatoptions:{srcformat: Y-m-d H:i:s, newformat: Y-m-d H:i:s}, 其它參數參考API轉載于:https://www.cnblogs.com/GYoungBean/archive/2013/03/20/2970598.html

大一大學計算機考試難嗎,新生必看!大一期間必考的3個證書,不考后悔,越拖越難考!...

原標題:新生必看!大一期間必考的3個證書,不考后悔,越拖越難考!9月開學季,大學新生也陸陸續續來到了學校報到,開啟自己美好的大學生活!但是!小編要提醒大家的是千萬不要相信高中老師說的那句:“上了大學你們…

我是如何實用:before :after

本文地址http://www.cnblogs.com/Bond/p/3972854.html 最近一直做移動端,沒和IE6打交道了,瞬間感覺世界變美好了。移動端雖然還是各種坑,但是比起修復IE6那還是輕松多了,移動端很多效果可以用CSS3來做,感覺一切都和諧…

rockmq運維指令_RocketMQ運維監控

一個完善的消息中間件,監控是必不可少的功能。通過監控我們可以查看系統的運行情況,是否出現異常,是系統穩定性和運維的基礎。1、監控平臺搭建RocketMQ控制臺需要自己去下載編譯打包,可以在編譯時設置其namesrvAddr和端口號&#…

Maven學習之 倉庫鏡像

使用倉庫鏡像 倉庫可以聲明在項目中,但有時,你可能想要使用某個倉庫的鏡像,而不去修改項目文件。 使用鏡像的原因: 有一個同步鏡像,且速度更快。想使用你自己控制的內部倉庫。想運行repository manager來提供一個本地的…

誰看的最多

今天想到了昨天看到一道acm題目,難度入門級別。“誰看的最多”,題目大概是這樣的:一隊列的人3 2 1 6 4 5,數值的大小表示該人的高度。每個人只能看到前面比他高的人,如1可以看見2、3。但是,如果有人B比他高…

計算機與網絡應用基礎知識下上機考試,計算機應用基礎知識考試

計算機應用基礎課程是提高高職學生計算機文化水平的公共必須課,那么你對計算機應用基礎知識了解多少呢?以下是由小編整理關于計算機應用基礎知識試題的內容,希望大家喜歡!計算機應用基礎知識試題1、計算機系統由硬件系統和軟件系統兩部分組成&#xff0…

分支-08. 高速公路超速處罰

按照規定,在高速公路上行使的機動車,超出本車道限速的10%則處200元罰款;若超出50%,就要吊銷駕駛證。請編寫程序根據車速和限速自動判別對該機動車的處理。 輸入格式:輸入在一行中給出2個正整數,分別對應車速…

lua 從一串數字中取出偶數位的數字_為什么JavaScript中 0.1 0.2 不等于0.3?

在 js 中進行數學的運算時,會出現0.10.20.300000000000000004的結果,一開始認為是浮點數的二進制存儲導致的精度問題,但這似乎不能很好的解釋為什么在同樣的存儲方式下0.30.40.7可以得到正確的結果。本文主要通過浮點數的二進制存儲及運算&am…

zookeeper啟動后沒有相關進程

查看狀態報錯,報錯,百度碩士nc問題,讓看.out文件,但是這哥文件是空的,那就看log 016-12-15 14:08:19,355 [myid:] - INFO [main:QuorumPeer$QuorumServer149] - Resolved hostname: StandByNameNode to address: Stan…

html如何播放h264視頻,瀏覽器 – 我如何播放H264視頻?

嗯..從它的外觀看起來它不像H264文件..通過MediaInfo運行它,我得到了這個:VideoFormat : AVCFormat/Info : Advanced Video CodecFormat profile : BaselineL2.0Format settings, CABAC : NoFormat settings, ReFrames : 1 frameWidth : 352 pixelsHeight : 288 pix…

ebs r12 -- adadmin: error while loading shared libraries: libclntsh.so.10.1

安裝EBS R12.2增加中文字符集時,運行$AU_TOP/bin/adadmin出錯: $ adadmin adadmin: error while loading shared libraries: libclntsh.so.10.1: cannot open shared object file: No such file or directory產因是沒有配置應用管理用戶的環境變量。 對.…