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;
}
相关文章:
Protobuf工具
#region 知识点一 什么是 Protobuf //Protobuf 全称是 protocol - buffers(协议缓冲区) // 是谷歌提供给开发者的一个开源的协议生成工具 // 它的主要工作原理和我们之前做的自定义协议工具类似 // 只不过它更加的完善&…...
闭包原理与常见陷阱
引言 JavaScript闭包是前端开发中既强大又神秘的概念,它不仅是面试的必考题,更是解决复杂问题的利器。闭包让函数能够记住并访问其创建时的作用域,即使在该函数在其定义环境之外执行。 然而,正如许多强大的工具一样,…...
用 VS Code / PyCharm 编写你的第一个 Python 程序
用ChatGPT做软件测试 编写你的第一个 Python 程序——不只是“Hello, World”,而是构建认知、习惯与未来的起点 “第一行代码,是一个开发者认知世界的方式。” 编程的入门,不只是运行一个字符串输出,更是开始用计算机思维来理解、…...
Linux学习心得问题整理(一)
day01 运维初识 理解云计算运维目的是什么? 搭建云计算更有利于我们在公网环境下方便访问我们服务 节省时间的成本,能随时随地方便调度硬件资源,更容易搭建软件服务 安全可靠,售后期间支持技术支持维护 什么是运维?…...
在scala中sparkSQL连接masql并添加新数据
以下是 Scala 中使用 Spark SQL 连接 MySQL 并添加数据的完整代码示例(纯文本): 1. 准备连接参数(需替换实际信息) scala val jdbcUrl "jdbc:mysql://localhost:3306/test_db?useUnicodetrue&characterEnc…...
STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
导言 如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。 项目地址: github: LL库: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library22_Basic_Timer寄存器方…...
.Net HttpClient 使用Json数据
HttpClient 使用Json数据 现代Web项目中,Json是最常用的数据格式。不论是前后端的交互中,还是纯前端项目中,都是如此。因此,.Net HttpClient 能不能更加方便、快捷的处理Json格式数据,也就至关重要了! 文末…...
AI时代,如何实现人机共舞?
在科技飞速发展的当下,人工智能(AI)已不再是科幻作品中的遥远想象,而是深入渗透到我们生活与工作的方方面面。从智能手机中的语音助手,到金融领域的风险预测模型;从医疗影像的智能诊断,到工业生…...
flea-cache使用之Redis哨兵模式接入
Redis哨兵模式接入 1. 参考2. 依赖3. 基础接入3.1 定义Flea缓存接口3.2 定义抽象Flea缓存类3.3 定义Redis客户端接口类3.4 定义Redis客户端命令行3.5 定义哨兵模式Redis客户端实现类3.6 定义Redis哨兵连接池3.7 定义Redis哨兵配置文件3.8 定义Redis Flea缓存类3.9 定义抽象Flea…...
【Docker】Docker环境下快速部署Ollama与Open-WebUI:详细指南
Docker环境下快速部署Ollama与Open-WebUI:详细指南 在本篇文章中,我们将深入探讨如何在Docker中高效部署 Ollama 和 Open-WebUI,并解决在实际使用中常见的问题,确保你的模型服务稳定高效地运行。 一、Ollama 和 Open-WebUI 快速部…...
FFmpeg在Android开发中的核心价值是什么?
FFmpeg 在 Android 开发中的核心价值主要体现在其强大的多媒体处理能力和灵活性上,尤其在音视频编解码、流媒体处理及跨平台兼容性方面具有不可替代的作用。以下是具体分析: --- 1. 强大的音视频编解码能力 - 支持广泛格式:FFmpeg 支持几乎所…...
Java的进制转换
进制知识 Java 中使用不同的前缀表示数据,常见的进制数据有二进制(0b)、八进制(0)、十进制(无)、十六进制(0x)。 public class Demo1 {public static void main(String…...
SpringBoot中的拦截器
SpringBoot中的拦截器 Filter 典型场景 全局鉴权/接口耗时统计 WebFilter("/*") public class CostFilter implements Filter {Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start System.currentTimeMill…...
使用聊天模型和提示模板构建一个简单的 LLM 应用程序
官方教程 官方案例 在上面的链接注册后,请确保设置您的环境变量以开始记录追踪 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者,如果在笔记本中,您可以使用以下命令设置它们 import getpass imp…...
paimon中批和流查看过去的快照的数据及变动的数据
1、批处理 创建表并插入三条数据 CREATE TABLE ws_t (id INT,ts BIGINT,vc INT,PRIMARY KEY (id) NOT ENFORCED ); INSERT INTO ws_t VALUES(2,2,2),(3,3,3),(4,4,4),(5,5,5); --设置执行模式为批处理 RESET execution.checkpointing.interval; SET execution.runtime-mode …...
Linux513 rsync本地传输 跨设备传输 一
ping节点bPing通 仅主机模式不需要设置网关节点a也可以Ping通节点b 同步成功 下载文件夹成功 今日源码 节点a 节点b...
c语言第一个小游戏:贪吃蛇小游戏08(贪吃蛇完结)
贪吃蛇撞墙和想不开咬死自己 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake food; struct snake *head; struct snake *tail; int key; int dir; #define UP 1 #define DOWN -1 …...
Android Native 之 自定义进程
在Android五层架构中,native层基本上全是c的世界,这些c进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c子进程,也是这众多的c进程,构建了整个android世界的native层。 …...
深度学习 自然语言处理(RNN) day_02
1. 感知机与神经网络 1.1 感知机 生物神经元: 1.1.1 感知机的概念 感知机(Perceptron),又称神经元(Neuron,对生物神经元进行了模仿)是神 经网络(深度学习)的起源算法&am…...
Kotlin 中的作用域函数
在 Kotlin 中,作用域函数是一组用于在对象上下文中执行代码块的函数。 它们通过简洁的语法实现对对象的操作和逻辑封装。 作用域函数的对比: 1 let 特点: 通过 it 访问对象,需显式使用;返回值是代码块的最后一行结果…...
Linux的SLES系统和其他几大系统之间的区别
✅ SLES 和其他主流 Linux 发行版对比表 特性/发行版SLES (SUSE Linux Enterprise Server)RHEL (Red Hat Enterprise Linux)CentOS / AlmaLinux / RockyUbuntu ServerDebian定位企业级,注重稳定性和支持企业级,行业标准,广泛应用社区版 RHEL…...
上位机学习攻略、步骤和实战路径
目录 🎯 一、什么是上位机? 🧭 二、学习步骤和路径 第一步:了解基础概念 第二步:掌握通信协议 1. 常见协议: 2. 学习目标: 第三步:熟悉主流上位机软件 可选工具及语言&#…...
【爬虫】DrissionPage-1
官网地址:DrissionPage官网 小需求采集,我喜欢,我要学。 1 介绍 这是用python编写的爬虫自动化工具,将Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式࿰…...
API安全
目录 API安全:从威胁到防护的全面解析 引言 一、API安全的定义与重要性 1.1 API安全的核心目标 1.2 API安全的挑战 二、API的常见安全威胁 2.1 身份验证攻击 2.2 中间人攻击(MITM) 2.3 注入攻击 2.4 安全配置错误 2.5 拒绝服务&…...
UDP和TCP协议
目录 1. UDP协议 1.1. UDP的特性 1.2. UDP的包头 1.3. UDP的三大使用场景和实际例子 1.4. TCP和UDP的区别 2. TCP协议 2.1. TCP包头格式 2.2. TCP包头和UDP包头对比 2.3. TCP协议的特点 2.4. TCP的三次握手(连接维护问题) 2.5. TCP的四次挥手…...
关于Go语言的开发环境的搭建
1.Go开发环境的搭建 其实对于GO语言的这个开发环境的搭建的过程,类似于java的开发环境搭建,我们都是需要去安装这个开发工具包的,也就是俗称的这个SDK,他是对于我们的程序进行编译的,不然我们写的这个代码也是跑不起来…...
【Bootstrap V4系列】学习入门教程之 组件-导航(Navs)
【Bootstrap V4系列】学习入门教程之 组件-导航(Navs) 导航(Navs)一、Base nav二、Available styles 可用样式2.1 Horizontal alignment 水平对齐2.2 Vertical 垂直的2.3 Tabs 表格样式2.4 Pills 胶囊样式2.5 Fill and justify 填…...
基于单片机的视力保护仪设计与实现
标题:基于单片机的视力保护仪设计与实现 内容:1.摘要 随着电子设备的普及,人们的视力健康面临着严峻挑战。为了有效预防近视等视力问题,本文旨在设计并实现一款基于单片机的视力保护仪。通过采用红外传感器、光敏传感器等元件,实时监测使用者…...
如何避免和恢复因终端关闭导致的 LoRA 微调中断
环境: Ubuntu20.04 Llama factory Qwen2.5-7B-Instruct llama.cpp H20 95G 问题描述: 使用命令 CUDA_VISIBLE_DEVICES1 FORCE_TORCHRUN1 llamafactory-cli train examples/train_lora/qwen2_5-7b_lora_sft.yaml 进行 LoRA 微调时,如果…...
RT-linux 系统详解
RT-Linux(Real-Time Linux)是一种基于Linux内核的实时操作系统(RTOS),旨在为Linux添加硬实时(Hard Real-Time)能力,使其适用于对时间确定性要求极高的嵌入式系统和工业控制场景。以下…...
开源网络地图可视化第六章学习指南
源代码地址:开源网络地图可视化-配套代码.zip - 蓝奏云 配套书籍:开源网络地图可视化——基于Leaflet的在线地图开发 (杨乃) (Z-Library)(1).pdf - 蓝奏云 3 第六章Leaflet地图动画 3.1 图标动画 3.1.1 沿线运动 沿线运动的动画使用了Leaflet.Geode…...
网页常见水印实现方式
文章目录 1 明水印技术实现1.1 DOM覆盖方案1.2 Canvas动态渲染1.3 CSS伪元素方案2 暗水印技术解析2.1 空域LSB算法2.2 频域傅里叶变换3 防篡改机制设计3.1 MutationObserver防护3.2 Canvas指纹追踪4 前后端实现对比5 攻防博弈深度分析5.1 常见破解手段5.2 进阶防御策略6 选型近…...
# 08_Elastic Stack 从入门到实践(八)---1
08_Elastic Stack 从入门到实践(八)—1 一、Logstash入门之简介以及部署安装 1、Elastic Stack 技术栈示意图 2、Logstash 简介 Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。(存储库当然是Ela…...
携程酒店 phantom-token token1004 分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 部分python代码 搞APP搞的心态有点崩…...
物理:从人体组成角度能否说明基本粒子的差异性以及组织结构的可预设性?
人类的个体差异源于粒子组合的复杂性、环境与随机性的相互作用,而非基本粒子本身的差异性。以下分层次解析: 一、基本粒子的同质性与组合多样性 1. 基本粒子的同一性 标准模型确认:同种类基本粒子(如电子、上夸克)具有完全相同的质量、电荷等属性,不存在个体差异。泡利不…...
前端面试每日三题 - Day 33
这是我为准备前端/全栈开发工程师面试整理的第33天每日三题练习: ✅ 题目1:Deno核心特性深度解析 革命性特性详解 // 安全权限控制(运行时显式授权) deno run --allow-netapi.example.com server.ts // 内置TypeScript支持 …...
JavaScript编译原理
在编程语言的世界中,编译器(如 GCC、TypeScript)和转译器(如 Babel)扮演着至关重要的角色,它们负责将人类可读的代码转换为机器或其他语言可执行的指令。这一过程通常分为四个关键阶段: 1. 词法…...
Nature图形复现—两种快速绘制热图的方法
相信大家在科研过程中,会遇到热图,有时候会觉得热图理解起来比较困难,或者觉得绘制热图也比较困难。本期教程我们来深入了解热图、绘制热图。 热图是一种通过颜色深浅或色阶变化来直观展示数据分布、密度或数值大小的可视化工具。它在多个领域…...
MySQL数据库——视图
目录 一、视图是什么? 二、特点 三、创建视图 四.查询视图 五.更新视图 六.视图的作用 总结 一、视图是什么? 视图是从一个或多个表中导出的虚拟表,它本身不存储数据,而是基于 SQL 查询的结果集。 二、特点 1.虚拟性࿱…...
标贝科技:大模型领域数据标注的重要性与标注类型分享
当前,大模型作为人工智能领域的前沿技术,其强大的泛化能力和复杂任务处理能力,依赖于海量数据的训练。而数据标注,作为连接原始数据与大模型训练的关键桥梁,在这一过程中发挥着举足轻重的作用。 大模型的训练依赖海…...
MYSQL备份恢复知识:第一章:备份操作举例
1. 备份工具 MySQL数据库的备份方式有两大类:一是物理备份,它对数据文件和日志进行整体备份;二是逻辑备份,通过DUMP工具将数据导出。具体的方法有以下几种: • 物理备份,MEB工具,是商用版本推荐…...
VS Code怎么设置python SDK路径
一、通过命令面板快速切换(推荐方法) 打开命令面板 • 快捷键:CtrlShiftP(Windows/Linux)或 CmdShiftP(macOS) • 输入命令:Python: Select Interpreter,回车后显示所有检…...
[经验总结]删除gitlab仓库分支报错:错误:无法推送一些引用到“http:”
问题描述 删除gitlab远程仓库报错。 [wingasowingaso release]$ git push gitlab --delete release remote: GitLab: You can only delete protected branches using the web interface. To http://x.x.x.x/gitlab/test.git! [remote rejected] release (pre-receive hoo…...
虹科干货 | CAN XL安全实践:深度防御下的密钥协商优化
摘要 随着汽车以太网的兴起和车载通信系统数量的增加,网络整合成为控制复杂性和成本的关键。当前架构呈现明确分层:以太网(100/1000Mbit/s)支撑信息娱乐、ADAS等高带宽应用,而CAN/CAN FD(0.5-5Mbit/s&#…...
Linux干货(一)
前言 从B站黑马程序员Linux课程摘选的学习干货,新手友好!若有侵权,会第一时间处理。 1.Linux目录结构 1.Linux操作系统的目录结构 Windows系统可以拥有多个盘符,如C盘、D盘、E盘 Linux没有盘符这个概念,只有一个根…...
Scala和Go差异
Scala和Go(又称Golang)是两种现代编程语言,各自具有独特的特性和设计哲学。 尽管它们都可以用于构建高性能、可扩展的应用程序,但在许多方面存在显著差异。 Scala和Go的详细比较,涵盖它们的异同点: 1. 语…...
PNG图片转icon图标Python脚本(简易版) - 随笔
摘要 在网站开发或应用程序设计中,常需将高品质PNG图像转换为ICO格式图标。本文提供一份高效Python解决方案,利用Pillow库实现透明背景完美保留的格式转换。 源码示例 from PIL import Imagedef convert_png_to_ico(png_path, ico_path, size):"…...
C语言中的宏
1.防止头文件重复包含 1.#pragma once #pragma once 是一个编译器指令,用于防止头文件被重复包含。它的核心作用是通过简单语法替代传统的头文件保护宏(#ifndef/#define/#endif),提升代码简洁性和可维护性。 作用详解 防止重复…...
飞拍技术介绍
运动控制探针功能详细介绍 运动控制探针功能详细介绍(CODESYS+SV63N伺服)_伺服探针功能-CSDN博客文章浏览阅读683次。文章浏览阅读1.2k次。本文详细介绍了如何使用汇川AM400PLC通过EtherCAT总线与禾川X3E伺服进行通信。包括XML硬件描述文件的下载与安装,EtherCAT总线的启用…...
Qt进阶开发:QTcpSocket的详解
文章目录 一、QTcpSocket 简介二、常用方法的介绍和使用三、常用的信号函数一、QTcpSocket 简介 QTcpSocket 是 Qt 网络模块中用于实现基于 TCP 协议的客户端通信的类。它提供了一个面向流的接口,允许程序通过套接字连接到远程主机,发送和接收数据。 所属模块:QtNetwork用于…...