Protobuf工具

? ? ? ?#region 知識點一 什么是 Protobuf
? ? ? ? //Protobuf 全稱是 protocol - buffers(協議緩沖區)
? ? ? ? // 是谷歌提供給開發者的一個開源的協議生成工具
? ? ? ? // 它的主要工作原理和我們之前做的自定義協議工具類似
? ? ? ? // 只不過它更加的完善,可以基于協議配置文件生成
? ? ? ? //C++、Java、C#、Objective - C、PHP、Python、Ruby、Go
? ? ? ? // 等等語言的代碼文件

? ? ? ? // 它是商業游戲開發中常常會選擇的協議生成工具
? ? ? ? // 有很多游戲公司選擇它作為協議工具來進行網絡游戲開發
? ? ? ? // 因為它通用性強,穩定性高,可以節約出開發自定義協議工具的時間

? ? ? ? //protocol - buffers 官網
? ? ? ? //https://developers.google.com/protocol-buffers
? ? ? ? #endregion
? ? ? ? #region 知識點二 Protobuf 的使用流程
? ? ? ? //1. 下載對應語言要使用 Protobuf 相關內容
? ? ? ? //2. 根據配置規則編輯協議配置文件
? ? ? ? //3. 用 Protobuf 編譯器,利用協議配置文件生成對應語言的代碼文件
? ? ? ? //4. 將代碼文件導入工程中進行使用
? ? ? ? #endregion
? ? ? ? #region 知識點三 下載 Protobuf 相關內容 — 準備 DLL 文件
? ? ? ? //1. 在官網中前往下載地址
? ? ? ? // protocol - buffers 官網
? ? ? ? // https://developers.google.com/protocol-buffers
? ? ? ? //2. 下載 protobuf - csharp
? ? ? ? //3. 解壓后打開 csharp\src 中的 Google.Protobuf.sln
? ? ? ? //4. 選擇 Google.Protobuf 右鍵生成 dll 文件
? ? ? ? //5. 在 csharp\src\Google.Protobuf\bin\Debug 路徑下找到對應.net 版本的 Dll 文件(我們使用 4.5 即可)
? ? ? ? //6. 將 net45 中的 dll 文件導入到 Unity 工程中的 Plugins 插件文件夾中
? ? ? ? #endregion
? ? ? ? #region 知識點四 下載Protobuf相關內容—準備編譯器
? ? ? ? //1.在官網中前往下載地址
? ? ? ? // ?protocol - buffers官網
? ? ? ? // ?https://developers.google.com/protocol-buffers
? ? ? ? //2.下載protoc - 版本 - win32或者64(根據操作系統而定)
? ? ? ? //3.解壓后獲取bin文件夾中的protoc.exe可執行文件,
? ? ? ? // ?可將其放入Unity工程中,方便之后的使用(你也可以不放入Unity工程,記住它的路徑即可)
? ? ? ? #endregion
? ? ? ? #region 總結
? ? ? ? //Protobuf全稱protocol-buffers
? ? ? ? //是谷歌提供給開發者的開源協議生成工具

? ? ? ? //我們要使用它主要準備兩步
? ? ? ? //1. 下載對應Csharp版本,生成DLL包文件導入工程中(之后的基類,序列化反序列化都基于DLL包中寫好的內容)
? ? ? ? //2. 下載對應操作系統的protoc編譯器,用于之后生成代碼文件(之后根據配置文件生成代碼都是通過該應用程序)
? ? ? ? #endregion

      #region 知識點一 回顧自定義協議生成工具中的配置文件//我們在自定義協議配置工具相關知識點中//使用的是xml文件進行配置//我們只需要基于xml的規則//按照一定規則配置協議信息//之后獲取xml數據用于生成代碼文件//在Protobuf中原理是一樣的//只不過Protobuf中有自己的配置規則//也自定義了對應的配置文件后綴格式#endregion#region 知識點二 配置后綴//Protobuf中配置文件的后綴統一使用//.proto//可以通過多個后綴為.proto的配置文件進行配置#endregion#region 知識點三 配置規則#region 規則1 注釋方式//方式1/*方式2*/#endregion#region 規則2 第一行版本號//syntax = "proto3";//如果不寫 默認使用proto2#endregion#region 規則3 命名空間//package 命名空間名;#endregion#region 規則6 特殊標識//1:required 必須賦值的字段//2:optional 可以不賦值的字段//3:repeated 數組//4.map 字典#endregion#region 規則7 枚舉//enum 枚舉名{//    常量1 = 0;//第一個常量必須映射到0//    常量2 = 1;//}#endregion#region 規則8 默認值//string-空字符串//bytes-空字節//bool-false//數值-0//枚舉-0//message-取決于語言 C#為空#endregion#region 規則9 允許嵌套#endregion#region 規則10 保留字段//如果修改了協議規則,刪除了部分內容//為了避免更新時,重新使用已經刪除了的編號//我們可以利用 reserved 關鍵字來保留字段//這些內容就不能再被使用了//message Foo {//    reserved 2, 15, 9 to 11;//    reserved "foo", "bar";//}#endregion#region 規則11 導入定義//import "配置文件路徑";//如果你在某一個配置中,使用了另一個配置的類型//則需要導入另一個配置文件名#endregion#endregion#region 總結//我們需要掌握Protobuf的配置規則//之后才能使用工具將其轉化為C#腳本文件#endregion 

test.proto和test2.proto文件

//規則二:版本號
syntax="proto3";//決定了proto文檔的版本號//規則一:注釋方式
//注釋方式一
/*注釋方式二*/ //規則十一: 導入定義
import "test2.proto";
//規則三:命名空間
package GamePlayerTest;//這決定了命名空間//規則四:消息類
message TestMsg{//規則五:成員類型和唯一編號//浮點數// =1不代表默認值,而是代表唯一號 方便我們進行序列化//required - 必須賦值的字段 proto2//optional - 可以不賦值的字段//requiredfloat testF = 1;//C#-float  optional double testD = 2;//C#-double //變長編碼//所謂變長 就是會根據 數字的大小 來使用對應的字節數來存儲//Protobuf幫助我們優化的部分 可以盡量少的使用字節數 來存儲內容int32 testInt32 = 3;//C#-int 它不太適用于表示負數 請使用sint32//1 2 4 8int64 testInt64 = 4;//C#-long 它不太適用于表示負數 請使用sint64//更實用表示負數類型的的整形sint32 testSInt32 = 5;//C#-int 適用于表示負數的整形sint64 testSint64 = 6;//C#-long 適用于表示負數的整形//無符號 變長編碼//1  2 4 uint32 testUInt32 = 7;//C#-uint 變長的編碼uint64 testUInt64 = 8;//C#-ulong 變長的編碼//固定字節數的類型fixed32 testFixed32 = 9;//C#-uint 它通常表示大于2的28次方的數,比uint32更有效 始終是4個字節fixed64 testFixed64 = 10;//C#-ulong 它通常表示大于2的56次方的數,比uint64更有效 始終是8個字節sfixed32 testSFixed32 = 11;//C# - int 始終是4個字節 sfixed64 testSFixed64 = 12;//C# - long 始終是8個字節//其它類型bool testBool = 13;//C#-boolstring testStr = 14;//C#-stringbytes testBytes = 15;//C# - BytesString 字節字符串//數組Listrepeated int32 listInt = 16;//C# - 類似List<int>的使用//字典Dictionary map<int, string> testMap = 17; //C# - 類似Dictionary<int,string>的使用//枚舉成員變量的聲明 需要唯一編碼TestEnum testEnum = 18;//聲明自定義類對象 需要唯一編碼//默認值是nullTestMsg2 testMsg2 = 19;//嵌套一個類在另一個類中 相當于是內部類message TestMsg3{int32 testInt32 =1;}TestMsg3 testMsg3 = 20;enum TestEnum2{NORMAL = 0;//第一個常量必須映射到0BOSS = 1;}TestEnum2 testEnum2 = 21;//int32 testInt323333 = 22;bool testBool34555 = 23;GameSystemTest.HeartMsg testHeart = 24;//告訴編譯器 22 被占用 不準用戶使用//之所以有這個功能 是為了在版本不匹配時 反序列化時 不會出現結構不統一//解析錯誤的問題reserved 22;reserved "testInt323333";}
//枚舉的申明
enum TestEnum{NORMAL = 0;//第一個常量必須映射到0BOSS = 5;
}
message TestMsg2{int32 testInt32 =1;
}
syntax="proto3";//決定了proto文檔的版本號
package GameSystemTest;//這決定了命名空間 
message HeartMsg
{int64 time = 1;
}

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

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

相關文章

zst-2001 上午題-歷年真題 軟件工程(38個內容)

CMM 軟件工程 - 第1題 b 軟件工程 - 第2題 c 軟件工程 - 第3題 c 軟件工程 - 第4題 b 軟件工程 - 第5題 b CMMI 軟件工程 - 第6題 0.未完成&#xff1a;未執行未得到目標。1.已執行&#xff1a;輸入-輸出實現支持2.已管理&#xff1a;過程制度化&#x…

軟考架構師考試-UML圖總結

考點 選擇題 2-4分 案例分析0~1題和面向對象結合考察&#xff0c;前幾年固定一題。近3次考試沒有出現。但還是有可能考。 UML圖概述 1.用例圖&#xff1a;描述系統功能需求和用戶&#xff08;參與者&#xff09;與系統之間的交互關系&#xff0c;聚焦于“做什么”。 2.類圖&…

數據結構(七)——圖

一、圖的定義與基本術語 1.圖的定義 圖G由頂點集V和邊集E組成&#xff0c;記為G(V,E)&#xff0c;其中V(G)表示圖G中頂點的有限非空集&#xff1b;E(G)表示圖G中頂點之間的關系&#xff08;邊&#xff09;的集合 注意&#xff1a;線性表可以是空表&#xff0c;樹可以是空樹&…

Android7 Input(六)InputChannel

概述: 本文講述Android Input輸入框架中 InputChannel的功能。從前面的講述&#xff0c;我們知道input系統服務最終將輸入事件寫入了InputChannel&#xff0c;而input屬于system_server進程&#xff0c;App屬于另外一個進程&#xff0c;當Input系統服務想要把事件傳遞給App進行…

【 Redis | 實戰篇 秒殺實現 】

目錄 前言&#xff1a; 1.全局ID生成器 2.秒殺優惠券 2.1.秒殺優惠券的基本實現 2.2.超賣問題 2.3.解決超賣問題的方案 2.4.基于樂觀鎖來解決超賣問題 3.秒殺一人一單 3.1.秒殺一人一單的基本實現 3.2.單機模式下的線程安全問題 3.3.集群模式下的線程安全問題 前言&…

如何用URDF文件構建機械手模型并與MoveIt集成

機械手URDF文件的編寫 我們用urdf文件來描述我們的機械手的外觀以及物理性能。這里為了簡便&#xff0c;就只用了基本的圓柱、立方體了。追求美觀的朋友&#xff0c;還可以用dae文件來描述機械手的外形。 import re def remove_comments(text):pattern r<!--(.*?)-->…

《構建社交應用的安全結界:雙框架對接審核API的底層邏輯與實踐》

用戶生成內容如潮水般涌來。從日常的生活分享&#xff0c;到激烈的觀點碰撞&#xff0c;這些內容賦予社交應用活力&#xff0c;也帶來管理難題。虛假信息、暴力言論、侵權內容等不良信息&#xff0c;如同潛藏的暗礁&#xff0c;威脅著社交平臺的健康生態。內容審核機制&#xf…

39:分類器流程

第一步 創建支持向量機分類器 create_class_svm (7, rbf, KernelParam, Nu, |ClassNames|, one-versus-one, principal_components, 5, SVMHandle) 第二步 添加樣本到分類器里 for ClassNumber : 0 to |ClassNames| - 1 by 1 *列出目錄下的所有文件 list_files (ReadPath…

LangChain對話鏈:打造智能多輪對話機器人

LangChain對話鏈:打造智能多輪對話機器人 目錄 LangChain對話鏈:打造智能多輪對話機器人ConversationChain 是什么核心功能與特點基本用法示例內存機制自定義提示詞應用場景與其他鏈的結合`SequentialChain` 是什么![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/0…

el-select 結合 el-tree:樹形下拉數據

一、單選 <template><div class"selectTree-wapper"><el-selectv-model"selectValue"placeholder"請選擇"popper-class"custom-el-select-class"ref"selectRef"clearableclear"clearHandle">&…

BFS算法篇——從晨曦到星辰,BFS算法在多源最短路徑問題中的詩意航行(下)

文章目錄 引言一、01矩陣1.1 題目鏈接&#xff1a;https://leetcode.cn/problems/01-matrix/description/1.2 題目分析&#xff1a;1.3 思路講解&#xff1a;1.4 代碼實現&#xff1a; 二、飛地的數量2.1 題目鏈接&#xff1a;https://leetcode.cn/problems/number-of-enclaves…

Leetcode (力扣)做題記錄 hot100(49,136,169,20)

力扣第49題&#xff1a;字母異位詞分組 49. 字母異位詞分組 - 力扣&#xff08;LeetCode&#xff09; 遍歷數組&#xff0c;將每一個字符串變成char數組 然后排序&#xff0c;如果map里面有則將他的值返回來&#xff08;key是排序好的字符串&#xff09; class Solution {pu…

【自學30天掌握AI開發】第1天 - 人工智能與大語言模型基礎

自學30天掌握AI開發 - 第1天 &#x1f4c6; 日期和主題 日期&#xff1a;第1天 主題&#xff1a;人工智能與大語言模型基礎 &#x1f3af; 學習目標 了解人工智能的發展歷史和基本概念掌握大語言模型的基本原理和工作機制區分不同類型的AI模型及其特點理解AI在當前社會中的…

WebRTC 源碼原生端Demo入門-1

1、概述 我的代碼是比較新的&#xff0c;基于webrtc源碼倉庫的main分支的&#xff0c;在windows下把源碼倉庫下載好了后&#xff0c;用visual stdio 2022打開進行編譯調試src/examples/peerconnection_client測試項目,主要是跑通這個demo來入手和調試&#xff0c;純看代碼很難…

【LeetCode】刪除排序數組中的重復項 II

題目 鏈接 思路 雙指針 我好聰明啊&#xff0c;自己想出了這個雙指針的辦法&#xff0c;哈哈哈哈哈哈哈&#xff0c;太高興了 代碼 class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""nlen…

通義千問席卷日本!開源界“卷王”阿里通義千問成為日本AI發展新基石

據日本經濟新聞&#xff08;NIKKEI&#xff09;報道&#xff0c;通義千問已成為日本AI開發的新基礎&#xff0c;其影響力正逐步擴大&#xff0c;深刻改變著日本AI產業的格局。 同時&#xff0c;日本經濟新聞將通義千問Qwen2.5-Max列為全球AI模型綜合評測第六名&#xff0c;不僅…

第J7周:對于ResNeXt-50算法的思考

目錄 思考 一、代碼功能分析 1. 構建 shortcut 分支&#xff08;殘差連接的旁路&#xff09; 2. 主路徑的第一層卷積&#xff08;11&#xff09; 4. 主路徑的第三層卷積&#xff08;11&#xff09; 5. 殘差連接 激活函數 二、問題分析總結&#xff1a;殘差結構中通道數不一致的…

如何解決Jmeter中的亂碼問題?

在 JMeter 中遇到亂碼問題通常是由于字符編碼不一致導致的&#xff0c;常見于 HTTP 請求響應、參數化文件讀取、報告生成等場景。以下是系統化的解決方案&#xff1a; 1. HTTP 請求響應亂碼 原因&#xff1a; 服務器返回的字符編碼&#xff08;如UTF-8、GBK&#xff09;與 J…

# YOLOv2:目標檢測的升級之作

YOLOv2&#xff1a;目標檢測的升級之作 在目標檢測領域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法以其高效的速度和創新的檢測方式受到了廣泛關注。今天&#xff0c;我們就來深入探討一下 YOLOv2&#xff0c;看看它是如何在繼承 YOLOv1 的基礎上進行…

小白入!WiFi 技術大解析

WiFi&#xff0c;全稱Wireless Fidelity&#xff0c;是一種無線局域網技術&#xff0c;允許電子設備通過無線電波連接到互聯網。以下是對WiFi的一些介紹&#xff1a; 一、基本概述 定義&#xff1a;WiFi是一種基于IEEE 802.11標準系列的無線局域網技術&#xff0c;使設備能夠…