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.mzph.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;使设备能够…