找回密码
 立即注册
查看: 213|回复: 0

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

[复制链接]
发表于 2023-3-2 13:36 | 显示全部楼层 |阅读模式
前言

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


基于二进制数据序列化与反序列化的基本原理详解
我们先来通过一个简单的案例,来讲解二进制序列化与反序列化的基本原理。任何一个复杂对象的数据都可以由简单的数据组合而成,比如 Vector3 结构体对象,就是由3个float分量x, y, z组合而成。数据对象的基本数据类型包括有: Int, float, double, string, boolean等。任何对象可以内嵌子对象,或者使用数组来存储多个子对象。子对象与数组,让我们的数据对象的组成关系可以变得非常复杂
接下来我们以一个对象为例来进行讲解:
struct Vector {
    int x;
    int y;
    int z;
}

struct Size {
    int w;
    int h;
}
class Rect {
    Vector org;
    Size s;
}Rect对象里面包含了Vector类与Size类子对象, 而这些子对象由基本的数据组成。我们要编码Rect对象,就要先编码Vector对象,再编码Size对象,这样才能得到Rect对象得编码。解下来我们针对Rect对象做编写编码函数,如下:
基本数据类型得编码函数,这个不用变,可以一次性写好,后面反复得使用;
byte[] Float_encode(float) {…}

byte[] Int_encode(int) {…}

byte[] string_encode(string) {…}

byte[] bool_encode(bool) {…}每个复杂的数据对象的内部结构都是开发者定义的,所以这块必要更具应用有多少个对象,来编写函数实现,而这些函数可以调用基本数据类型的编码函数,最后组合成byte[];
byte[] Vector_encode(Vector v) {
    byte[] b1 = int_encode(v.x);
    byte[] b2 = int_encode(v.y);
    byte[] b3 = int_encode(v.z);
    return b1 + b2 + b3;
}
byte[] Size_encode(Size s) {
    byte[] b1 = int_encode(s.w);
    byte[] b2 = int_encode(s.h);
    return b1 + b2;
}
byte[] Rect_encode(Rect r) {
    byte[] b1 = Vector_encode(r.org);
    byte[] b2 = Size_encode(r.s);
    return b1 + b2;
}解码也类似,基本的数据类型,可以实现一次解码函数,复杂的对象,都是由开发者自己调用基本数据类型的解码,一个个的解码出来。
经过上面的分析,我们总结如下:


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


总结以下, Protobuf包含了:协议编写语法规则,协议编译器,runtime库, 与编译器生成代码。我们根据语法编写好协议,编译器生成对应的代码,对应的代码调用了runtime库中的底层接口。我们项目内置runtime库 + 编译器生成的代码,这样就可以使用这些数据类型,做序列化与反序列化。


Unity如何集成使用Protobuf
Unity项目如何使用Protobuf呢?按照下面的步骤来实现可以了。
(1) 内置C#的protobuf的runtime库代码到Unity项目,复制过来,直接放Unity就可以了。我一般会在Scripts下新建一个3rd文件夹来存放,如下图所示:




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






今天的分享就到这里了,关注我,学习更多网络游戏相关的开发知识。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 03:34 , Processed in 0.089746 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表