当前位置: 首页 > news >正文

Unity之C#端使用protobuf

什么是protobuf

protobuf全称Protocol Buffers,由Google推出的一种平台、语言无关的数据交互格式,目前使用最广泛的一种数据格式,尤其在网络传输过程中,有很强的安全性,而且数据量比json和xml要小很多。
最主要的是protobuf支持的语言非常多,不管你是.net,java,lua,iOS,android,python,go,等等等等。都可以支持互相通信。
我们之前的游戏框架都是lua的,所以protobuf用的也都是lua版本的。最近转用C#写框架了,所以需要一套.net端的protobuf,所以把踩得坑总结下来。

protobuf库选择

protobuf的.net实现主要有两个版本:

  • (Google.Protobuf](https://github.com/protocolbuffers/protobuf)
    Google官方维护,项目前身是protobuf-csharp-port。
    优势:在多平台协作开发时,定义一份协议,可以在各个语言中共用。

  • protobuf-net
    社区维护,主要由Marc Gravell管理维护
    优势:相对来说,更符合.net开发习惯;对于纯粹的.NET程序,使用起来更加方便

google.protobuf使用

如果使用google版本的,那么就可以使用官方提供的最新的语法,最新的工具,等等,官方文档
库下载:
安装Nuget包:Google.Protobuf和Google.Protobuf.Tools
.proto生成.cs代码工具:
直接使用tools中或者从github下载最新的protoc。因google把全平台的proto都整合了统一通过protoc.exe来生成。
生成命令:或可参考https://protobuf.dev/reference/csharp/csharp-generated/

protoc --proto_path=bar --csharp_out=src --csharp_opt=base_namespace=Example player.proto

序列化示例

public void SimplestUse()
{Player player= new Player ();player.ID = 2;player.Name = "测试 Google.ProtoBuf";using (MemoryStream memoryStream = new MemoryStream()){player.WriteTo(memoryStream);}
}

protobuf-net使用

使用protobuf-net版本,是目前大多数C#项目所选择的方向,原因大概率是语法习惯比较友好吧。protobuf-net的数据类不仅可以通过.proto生成,还可以手写。不过我觉得可能手写有点太麻烦了。网络交互肯定还是要和服务器公用.proto文件的。
示例:

using ProtoBuf;
namespace Test
{[ProtoContract]public class Player{[ProtoMember(1)]public int ID { get; set; }[ProtoMember(2)]public string Name { get; set; }}
}

安装Nuget包:protobuf-net和protobuf-net.ProtoGen
目前这两个文件,除了Nuget,我还没有找到纯正的官方途径下载。不过protobuf-net最近没啥更新,所以从哪里下载都是一样的。
生成命令:

protogen.exe -i:player.proto -o:player.cs

序列化示例:

public void SimplestUse()
{Player player= new Player ();player.ID = 1;player.Name = "测试 protobuf-net";using (MemoryStream memoryStream = new MemoryStream()){ProtoBuf.Serializer.Serialize(memoryStream, player);}
}

性能比较:

两个库直接性能差距并不是很大,测试数据参考:https://www.shisujie.com/blog/Google-ProtoBuf-vs-ProtoBuf-Net

最后

Unity技术开发干活 - 总目录

Unity精选 - 专栏目录

Unity之ASE入门到精通 - 专栏目录

UniRx入门到精通 - 专栏目录

http://www.lryc.cn/news/16380.html

相关文章:

  • C++设计模式(18)——模板方法模式
  • SQLserver 索引碎片
  • 【Storm】【二】安装
  • Android ConditionVariable
  • Action Segmentation数据集介绍——Breakfast
  • 横道图时间标尺在P6软件中的设置
  • 空间复杂度(超详解+例题)
  • Document-Level event Extraction via human-like reading process 论文解读
  • H5盲盒抽奖系统源码
  • 低代码平台和无代码平台哪个更适合开发企业管理系统?
  • 75岁彪马再发NFT 复活美洲狮IP
  • 大学生成人插画培训机构盘点
  • 【算法基础】一维差分 + 二维差分
  • 游戏服务器框架 技能buff篇
  • 网友说socket通信讲的不彻底,原来这才是Socket
  • Nginx第二讲
  • redis(win版)
  • 【Linux】编辑器——vim(最小集+指令集+自动化配置)
  • Centos7+Xshell+Jenkins堆装
  • Android system实战 — Android R(11) 进程保活白名单
  • oracle表 分组,并查每组第一条
  • Java代码弱点与修复之——DE: Dropped or ignored exception(无视或忽略异常)
  • JavaEE简单示例——动态SQL之更新操作<set>元素
  • 【极海APM32替代笔记】低功耗模式配置及配置汇总
  • 攻击者失手,自己杀死了僵尸网络 KmsdBot
  • 东阿县高新技术企业认定条件和优惠政策 山东同邦科技分享
  • 【基础算法】哈希表(拉链法)
  • 硬件学习 软件Cadence day07 PCB 底板电路图布线
  • SkyWalking仪表盘使用
  • 面渣逆袭:分布式十二问,万字图文详解