ainatipen 发表于 2023-2-4 21:53

网络游戏协议:基于Protobuf的序列化与反序列化

本节給大家讲解的是网络游戏开发中的序列化与反序列化。当我们要存储/传送一个数据对象的数据的时候,我们要把这个数据对象实例编码成二进制数据,这样就可以把这些二进制进行存储与传送。当我们接收读取这些二进制的时候,我们有可以根据数据把对应的数据对象实例重建出来,这个过程,我们叫做序列化与反序列化。本节将从以下3点来详细的讲解基于Protobuf的序列化与反序列化。如下:


对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。
基于二进制数据序列化与反序列化的基本原理详解


接下来我们以一个对象为例来进行讲解:


Rect对象里面包含了Vector类与Size类子对象, 而这些子对象由基本的数据组成。我们要编码Rect对象,就要先编码Vector对象,再编码Size对象,这样才能得到Rect对象得编码。解下来我们针对Rect对象做编写编码函数,如下:
基本数据类型得编码函数,这个不用变,可以一次性写好,后面反复得使用;


每个复杂的数据对象的内部结构都是开发者定义的,所以这块必要更具应用有多少个对象,来编写函数实现,而这些函数可以调用基本数据类型的编码函数,最后组合成byte[];


解码也类似,基本的数据类型,可以实现一次解码函数,复杂的对象,都是由开发者自己调用基本数据类型的解码,一个个的解码出来。


Protobuf的设计架构与对应工具
上面总结分析出来的这四点,为了解决上面的问题,google 发起了一个protobuf的开源项目。目前我们做网络游戏中序列化、反序列化很多都是基于它来做的。Protobuf解决上序4个问题,主要的设计如下:


(5) 开发者只需要将要序列化/反序列化的数据对象定义到协议文件,然后运行编译器生成协议文件对应的目标编程语言的代码, 就可以使用里面的类与对象了。




Unity如何集成使用Protobuf




(2) 使用cmake源码编译protobuf,来生成protoc的编译工具,如果自己懒得编译,可直接到github上下载已经编译好的protoc。


(3) 在Unity Assets文件夹外面定义一个协议生成文件夹,专门用来定义协议文件.proto, 然后运行编译器生成 c#代码,然后再拷贝到项目Assets的指定代码目录下。






今天的分享就到这里了,关注我,学习更多网络游戏相关的开发知识。
页: [1]
查看完整版本: 网络游戏协议:基于Protobuf的序列化与反序列化