美文网首页
FlatBuffer优化数据传输性能

FlatBuffer优化数据传输性能

作者: 石器时代小古董 | 来源:发表于2018-07-25 10:14 被阅读0次

    [FlatBuffer系列介绍]https://www.jianshu.com/p/a110390a65fa
    FlatBuffer原理介绍
    FlatBuffer性能原理介绍
    FlatBuffer使用介绍

    一、FlatBuffer的优点和缺点

    优点

    1.对序列化数据的访问不需要打包和拆包——它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而没有任何解析开销;

    2.内存效率和速度——访问数据时的唯一内存需求就是缓冲区,不需要额外的内存分配;
    扩展性、灵活性——它支持的可选字段意味着不仅能获得很好的前向/后向兼容性(对于长生命周期的游戏来说尤其重要,因为不需要每个新版本都更新所有数据);

    3.最小代码依赖——仅仅需要自动生成的少量代码和一个单一的头文件依赖,很容易集成到现有系统中。
    4.强类型设计——尽可能使错误出现在编译期,而不是等到运行期才手动检查和修正;

    5.使用简单——生成的C++代码提供了简单的访问和构造接口;而且如果需要,通过一个可选功能可以用来在运行时高效解析Schema和类JSON格式的文本;

    6.跨平台——支持C++11、Java,而不需要任何依赖库;在最新的gcc、clang、vs2010等编译器上工作良好。

    缺点

    定义数据结构相对麻烦
    数据的可读性没有json好
    构建可序列化对象很麻烦
    需要使用工具生成Java代码

    二、FlatBuffer的原理

    参考
    参考
    简单的来说就是把对象数据,保存在一个一维的数组中。FlatBuffer将数据都缓存在一个ByteBuffer中,每个对象在数组中被分为两部分。元数据部分:负责存放索(索引相对于中间部分开始记录)。真实数据部分:存放实际的值。分割的节点为(pivot point)。它的将数据以及对应的数据位置都保存在一个线性的数组中。使用的时候只需要把byte流发送出去,解析的时候只需要根据保存的位置,截取对应的数值即可。

    例子:
    假设我们创建了一个Person对象,它的name是John,friendshipStatus是2.那么对应图中元数据部分第一个byte是1--->从中心点处数一个位置,开始的字符就是name的值即john。第二个byte是6,从中心点数6个位置值是2.

    class Person {
        String name;//john
        int friendshipStatus;//2
        Person spouse;
        List<Person>friends;
    }
    
    image.png

    三、FlatBuffer搭建环境

    在mac环境下。
    1.首先最好安装了Xcode
    2.安装Cmake
    3.下载Flatbuffer源码
    4.使用cmake编译项目
    可以使用可视化界面,也可以使用命令

    cmake -G "Unix Makefiles"
    

    5.使用make指令编译项目
    6.使用make install命令生成flatc文件
    如果一切顺利生成如下的文件,这里的flatc就是可以编译的文件,如果make install 不顺利,那么直接将这个文件拖入控制台也可以使用。

    image.png

    遇见的问题
    xcrun: error: invalid active developer path, missing xcrun

    没有安装xcode
    xcode-select --install
    

    no permission
    makeinstall遇见了问题,不能正常安装

    sudo make install
    

    Android环境下使用FlatBuffer

    1.首先定义Scheme
    Scheme代表要接收的数据结构,后缀是fbs
    2.使用flatc将scheme生成要使用的java文件
    3.将生成的java文件考入到项目中

    namespace com.efrobot.robot;
    table Module{
      module_id:long;
      module_name:string;
      action_name:string;
      data_extra_name:string;
      controlType:int;
      overcurrent_time:int;
      message_id:int;
      data:data;
    }
    
    table data{
      wheel:wheel;
    }
    
    table wheel{
      direction:string;
      speed:int;
    }
    root_type Module;
    
    
    /Users/apple/Desktop/flatc -o /Users/apple/Desktop/workspace/opensource/flatbuffers/out -j /Users/apple/Desktop/workspace/opensource/flatbuffers/data/name.fbs
    
    image.png

    4.在gradle中引入工具

        compile 'com.github.davidmoten:flatbuffers-java:1.9.0.1'
    

    5.使用生成的Java文件构建数据模型
    1.使用start方法表示开始构建
    2.使用end方法表示结束构建
    3.因为Flatbuffer不仅记录数据,还记录索引,所以如果是string类型的数据,需要特殊的createString方法记录值,并且拿到返回的索引位置
    4.如果要创建的是一个对象,使用对应的对象类的create方法来创建这个对象,并记录它的索引值。
    5.使用FlatBufferBuilder的finish方法结束构建
    6.用sizedByteArray方法获得数据流

    image.png
    7.数据解析的时候只需通过getRoot方法将buffer方法转换为对象即可
    8.通过对象.的形式获取数据源
    image.png

    相关文章

      网友评论

          本文标题:FlatBuffer优化数据传输性能

          本文链接:https://www.haomeiwen.com/subject/cfxspftx.html