Unity接入Protobuf介绍
Protobuf介绍
Protobuf(Protocol Buffers,简称Proto)是一种轻量级和高效率的数据序列化格式,由Google公司开发。与XML和JSON等文本格式不同,Protobuf是一种二进制格式,它具有更小的体积和更快的速度。在大规模数据交换和存储中,Protobuf很受欢迎,并被用于许多Google产品和开源项目中。
Protobuf定义数据结构和消息格式,这些消息可以在不同的平台和编程语言之间相互传递和解析。与XML和JSON等文本格式不同,Protobuf消息可以通过编译器自动生成代码,并提供了更好的类型检查和更好的性能。通过使用Protobuf,您可以轻松地定义和序列化数据结构,而无需关注底层协议细节。这使得Protobuf在网络通信、存储和数据交换等领域中非常有用。它可以用于数据序列化、网络通信、数据存储等场景,具有高效、可扩展、跨平台等特点。
Protobuf的优点包括:
- 高效:Protobuf使用二进制格式进行数据交换,比文本格式更加紧凑,可以减少网络传输和存储空间。
- 可扩展:Protobuf支持向后和向前兼容的数据格式升级,可以在不影响现有代码的情况下进行升级。
- 跨平台:Protobuf支持多种编程语言和操作系统,包括C++、Java、Python、Go等,可以在不同的平台和语言之间进行数据交换。
- 易用:Protobuf的代码生成工具可以自动生成序列化和反序列化代码,简化了开发人员的工作。
总之,Protobuf是一种高效、可扩展、跨平台的数据交换格式并且支持多种编程语言,可以在不同的平台和语言之间进行数据交换。如果您需要进行数据序列化、网络通信或数据存储,Protobuf是一个值得考虑的选择。
Protobuf数据结构定义
Protobuf的数据结构定义使用.proto文件进行描述,包括消息类型、字段类型、字段名称等信息。例如,下面是一个简单的.proto文件示例:
```
syntax = "proto3";message Person {string name = 1;int32 age = 2;repeated string hobbies = 3;
}
```
这个.proto文件定义了一个名为Person的消息类型,包含三个字段:name、age和hobbies。其中,name和age是普通字段,hobbies是一个重复字段,可以包含多个值。
使用Protobuf的代码生成工具可以根据.proto文件生成对应的代码,例如Java语言的代码:
syntax = "proto3";message Person {string name = 1;int32 age = 2;repeated string hobbies = 3;
}
生成的Java代码可以用于序列化和反序列化Person消息,例如:
Person person = Person.newBuilder().setName("Alice").setAge(30).addHobbies("reading").addHobbies("swimming").build();byte[] data = person.toByteArray();Person newPerson = Person.parseFrom(data);
Unity接入Protobuf
Unity可以通过以下步骤来接入protobuf:
1.下载最新版本的protobuf库
可以从官方网站https://developers.google.com/protocol-buffers/下载最新版本的protobuf库
2.将protobuf库文件导入Unity项目中
将下载的文件解压后,将其中的Google.Protobuf.dll文件拷贝至Unity项目的Assets/Plugins目录下。
3.定义protobuf消息
在Unity项目中创建.proto文件,定义需要的protobuf消息。
例如:
syntax = "proto3";message UserInfo {string name = 1;int32 age = 2;repeated string hobbies = 3;
}
4.将proto文件生成C#脚本
在命令行中运行如下命令,生成C#类文件:
protoc --csharp_out=. <proto_file_name>.proto
执行完该命令后,会在当前目录下生成一个与.proto文件同名的.cs文件,将生成的C#类文件拷贝至Unity项目中。
5.protobuf序列化和反序列化
使用Google.Protobuf库中提供的API,将protobuf消息序列化为二进制数据,或者将收到的二进制数据反序列化为protobuf消息。
例如,向服务端发送消息:
UserInfo userInfo = new UserInfo
{Name = "张三",Age = 20,Hobbies = { "篮球", "游泳" }
};
byte[] data = userInfo.ToByteArray();
// 将data发送给服务端
从服务端接收到消息后,反序列化为protobuf消息:
byte[] data = ... // 接收到的二进制数据
UserInfo userInfo = UserInfo.Parser.ParseFrom(data);
Debug.Log(userInfo.Name);
Debug.Log(userInfo.Age);
foreach (string hobby in userInfo.Hobbies)
{Debug.Log(hobby);
}
以上就是在Unity中接入protobuf的基本步骤。需要注意的是,protobuf消息的定义和使用与普通的C#类有所不同,需要按照protobuf的语法进行定义和使用。
相关文章:
Unity接入Protobuf介绍
Protobuf介绍 Protobuf(Protocol Buffers,简称Proto)是一种轻量级和高效率的数据序列化格式,由Google公司开发。与XML和JSON等文本格式不同,Protobuf是一种二进制格式,它具有更小的体积和更快的速度。在大…...
【anaconda】numpy.dot 向量点乘小技巧
假设向量A[1,1], 向量B[2,3]。如果想知道他们的内积就可以输入如下代码: 当然,如果是两个列向量相乘,肯定是不对的 但是如果没有维度也一样可以求得内积,而且结果不会套在列表里...
YOLOv5小目标检测层
目录 一、原理 二、yaml配置文件 一、原理 小目标检测层,就是增加一个检测头,增加一层锚框,用来检测输入图像中像素较小的目标 二、yaml配置文件 # YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters nc: 3 # number of classes depth_multiple: 0.33 # model…...
mysql 更改密码
由于两台设备的mysql数据库的密码不一样,开发时每次连接数据库都需要更改配置文件,所以想修改一下mysql数据库的密码。 mysql 修改密码千万不要直接修改,直接修改的话会出现两种情况: 1,修改成功,无法登录。…...
Android YUV存储方式
排名 性能:YUV444 > YUV422 > YUV420 > YUV411 YUV444:YUV444 提供最高质量的色彩准确性和图像细节,但需要更多的存储空间和传输带宽。适用于对图像质量要求很高的应用,如专业视频编辑或高端图像处理。YUV422࿱…...
SSM家具个性定制管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
一、源码特点 SSM 家具个性定制管理系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用…...
来自Microsoft Teams的摄像头背景图片
原文件在👆,下面是预览图 如果你安装了Microsoft Teams也可以搜索MSTeams,就在MSTeams/Backgrounds...
飞书如何接入ChatGPT-打造个人智能问答助手实现无障碍交流
目录 前言 环境列表 1.飞书设置 2.克隆feishu-chatgpt项目 3.配置config.yaml文件 4.运行feishu-chatgpt项目 5.安装cpolar内网穿透 6.固定公网地址 7.机器人权限配置 8.创建版本 9.创建测试企业 10. 机器人测试 总结 前言 在飞书中创建chatGPT机器人并且对话&am…...
Proteus仿真--基于1602LCD的秒表设计
本文介绍基于1602LCD的秒表设计(完整仿真源文件及代码见文末链接) 仿真图如下 本设计中80C51单片机作为主控,用1602LCD作为显示模块,共有2个按键,K1按键用于秒表计时启停控制,K2用于清零显示内容 仿真运…...
香港站群服务器中1C/2C/4C/8C 的概念及区别
在选择香港站群服务器时,经常会看到1C、2C、4C和8C等不同的IP段。这些IP段代表了不同的子网掩码长度,也反映了服务器的IP地址数量和丰富性。 让我们来了解一下什么是IP段。IP段是指一组连续的IP地址,其中每个地址的前三个数字相同&…...
搭建SRS视频服务器
去官方网站下载FFmpeg6.1 https://ffmpeg.org/download.html拷贝到CentOS7.9中的/opt目录下,解压并重命名 tar -xvf ffmpeg-6.1.tar.xz 解压后编译安装 ./configure make make install从github下载SRS4.0release 解压后 如果ffmpeg的路径不在/usr/local/bin/ffmpe…...
【C++初阶】STL详解(八)List的模拟实现
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
Day02嵌入式---按键控灯
一、简单介绍 按键控制灯开关是一种常见的嵌入式系统示例项目,它通常用于演示嵌入式系统的基本控制能力。该项目由一个或多个LED和一个按键组成。通过按下按键,可以控制LED的开关状态,从而实现灯的亮灭控制。 二、查看功能手册 2.1 查看硬件…...
Centos设置nginx开机自启动设置
Centos设置nginx开机自启动设置 要设置CentOS中的Nginx开机自启动,可以按照以下步骤进行操作: 首先,登录到CentOS服务器上,并以root用户或具有sudo权限的用户身份执行以下命令来安装Nginx(如果尚未安装)&a…...
拼接合并yuv序列转成mp4
ffmpeg需要用支持libx264的版本,如果需要,可以从这个网站下载编译支持libx264\x265的ffmpeg https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-6.1-essentials_build.7z #-*- coding:utf-8-*- import osif __name__ "__main__":# 1 输入…...
访谈 破风之人毛京波,选择难而正确的路
“无论是在燃油时代还是电动时代,我们所做的一切,只为回归纯粹的驾驶乐趣。”履新路特斯中国总裁整整一年的毛京波,从不放过任何一个展示路特斯品牌驾驭精神的机会。 11月17日,广州车展开幕首日,位于5.2馆的路特斯“冠…...
java实现一个简单的监听器
在 Java 中,我们可以通过实现监听器(Listener)模式来处理事件和回调。监听器模式是一种常见的设计模式,用于实现对象间的松耦合通信。本文将介绍如何在 Java 中实现一个简单的监听器。 步骤 以下是实现一个监听器的基本步骤&…...
用HALCON标定助手对相机进行标定
任务要求: 已知相机镜头焦距f为8mm,相机单个CCD像素在水平和竖直两个方向上的尺寸均为3.75微米,相机为普通透光镜头和面阵相机,对相机进行标定,测量相机的内外参数。 操作步骤: 1. 在HALCON中运行gen_ca…...
5 个适用于 Windows 的顶级免费数据恢复软件
对于计算机来说,最重要的是用户数据。除了您的数据之外,有关计算机的其他所有内容都是可替换的。这三个是数据丢失的最常见原因: 文件/文件夹删除丢失分区分区损坏 文件/文件夹删除 文件/文件夹删除是最常见的数据丢失类型。大多数时候&am…...
MySQL 批量插入记录报 Error 1390 (HY000)
文章目录 1.背景2.问题3.分批插入4.一次最多能插入多少条记录?5.什么是 Prepared Statement?参考文献 1.背景 Golang 后台服务使用 GORM 实现与 MySQL 的交互,在实现一个通过 Excel 导入数据的接口时,使用 Save 方法一次性插入大…...
从零到一:解锁Obsidian核心功能与高效工作流
1. 为什么选择Obsidian构建知识体系? 第一次打开Obsidian时,你可能和我当初一样感到困惑——这个看起来朴素的Markdown编辑器,凭什么被称作"第二大脑"?经过两年深度使用,我的个人知识库已经积累了超过2000条…...
Windows环境下IDEA集成Java与Protobuf的高效开发指南
1. 环境准备:Protobuf与IDEA的安装配置 在Windows系统下搭建Java与Protobuf的开发环境,就像组装一台高性能电脑——每个部件都要选对型号、正确安装。我经历过无数次环境配置的翻车现场,这里把最稳妥的配置方案分享给你。 首先去Protobuf的…...
加一把锁,最坏要穿越4次用户态-内核态边界——从glibc源码拆解std::mutex的真实代价
同一把 std::mutex,同一行 lock() + unlock()。无竞争时一个完整周期约 50 纳秒,有竞争时膨胀到 5-15 微秒——差了100到300倍。 这个差距不是线性累积出来的。它在某个临界点突然跳变——从两条原子指令跳到两次系统调用、两次上下文切换、四次穿越用户态-内核态边界。你的…...
本科生论文写作新选择:百考通AI实战指南,告别熬夜与低效
如果你是一名正在为毕业论文发愁的本科生,这篇文章可能会帮到你。在CSDN这个以技术分享与实用干货为主的社区,我们不谈夸张的“黑科技”,只聊实实在在能提升效率的工具与方法。今天要介绍的,是一款名为百考通AI的辅助写作工具&…...
多模态注意力机制演进全景图(2017–2024):17篇顶会论文验证的5大范式跃迁与3类致命陷阱
第一章:多模态大模型中的注意力机制 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型依赖注意力机制实现跨模态对齐与语义融合,其核心在于动态建模文本、图像、音频等异构输入之间的细粒度关联。不同于单模态场景中相对统一的token序列&…...
终极Mantle开发问题解决指南:从GitHub Issues到Stack Overflow的实战技巧
终极Mantle开发问题解决指南:从GitHub Issues到Stack Overflow的实战技巧 【免费下载链接】Mantle Model framework for Cocoa and Cocoa Touch 项目地址: https://gitcode.com/gh_mirrors/ma/Mantle Mantle作为Cocoa和Cocoa Touch的Model框架,在…...
基于FPGA的OBC DCDC HIL测试系统:高频场景下的实时仿真与验证
1. 为什么需要FPGA做OBC DCDC的HIL测试? 我第一次接触OBC DCDC的HIL测试是在2018年,当时测试一个SiC MOSFET的LLC谐振变换器,用传统实时仿真机跑100kHz开关频率模型时,直接出现了波形失真。后来才发现问题出在仿真步长上——当开关…...
gInk:Windows上最实用的免费屏幕标注工具完全指南
gInk:Windows上最实用的免费屏幕标注工具完全指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 你是否曾在演示时需要快速圈出重点,或在线会议…...
VBA年终损益一键结转宏,打破手动做结转分录传统,财务表格嵌入宏代码,一键自动结转全年收支算净利润,不用死编分录,AI操作碾压手工做账逻辑。
一套“VBA 年终损益一键结转宏”完整实战方案,定位非常锋利: 把“手工编结转分录”变成“一键自动结账” 让年终损益结转从会计苦力活变成系统自动动作 ✅ 智能会计课程 Excel 总账实训 ✅ 中小企业 / 代理记账年终结账 ✅ 技术博客 VBA 实战案例 一、…...
[RK3588-Android12] 音频策略深度解析:如何精准配置ES8388喇叭的多媒体播放优先级
1. RK3588平台音频策略问题现象解析 最近在调试RK3588平台的Android12系统时,遇到一个典型的音频问题:使用ES8388 Codec时,喇叭播放多媒体内容无声,但通话和闹钟声音却正常。这个问题困扰了不少开发者,我也是在项目调试…...
