如何提高Dragonbones骨骼文件的读取速度----Dragonbones4.5版本骨骼文件的二进制解析方案

  Dragonbones的默认导出的骨骼文件为xml、json文件。尽管xml、json文件有一些自身的优势,但是在手游上,硬件条件有限的情况下,追求更快的运行速度,xml、json却无法满足需求。尤其是需要一次性加载很多的xml文件时,效率完成暴露出来了。这也就是我为什么写这篇blog的目的。如何提高文件的读取速度,无非就是将骨骼文件转换成二进制文件去解析。

  注:本篇blog是基于Dragonbones 4.5的数据格式进行的二进制转换。

如何转换,下面我为大家讲解具体过程:

准备工作

  1、这里我们要用到一个google的开源库Flatbuffers,关于Flatbuffers如何使用,大家可以转到c++对象的序列化与反序列化的解决方案----flatbuffers的使用,有具体介绍如何使用。

  2、DragonBoneFlatbuffer是我写好的一个dragonbones骨骼数据的转换工具的源代码,这里我主要是介绍如何使用,以方便以后大家自己修改。

工程简介

  项目中有两个目录:tools、xmlToBinary。tools里面主要是flatbuffers的schema定义文件、将schema转换成.h的flatc的可执行文件(mac版本)、还有一个用来执行转换命令的shell脚步文件。xmlToBinary就是我们的主要工程文件,里面有xcode和vs的两个工程,直接打开编译就可以得到我们的工具。

  一、Tools目录介绍

    dragonbones.fbs文件中有很多的Flatbuffers对象属性,这些属性的定义,我是根据c++中dragonbones对象的属性一一对应创建的。这样保证我的c++对象的每个有用的成员变量都能在Flatbuffers的对象属性中找到与之对应。关于更多关于fbs文件的写法,大家可以看c++对象的序列化与反序列化的解决方案----flatbuffers的使用或是参考官方的文档。

    flatc文件是flatc.cpp文件编译得到的。大家可以在下面的连接中找到https://github.com/Relvin/DragonBoneFlatbuffer/tree/master/xmlToBinary/classes/flatbuffers。(当然这里的flatbuffers并不是google官方最新的文件。这个是我为了与cocos2dx中引用的flatbuffers库保持统一,直接从cocos2dx项目中拉出来了。这样我们如果想加入到我们的cocos2dx项目工程中就不需要自己添加Flatbuffers库,而直接引用cocos自带的就可以了。)如果你是windows的用户你就可以在windows平台上编译一个flatc的可执行文件。

    generate_code.sh就是用flatc将fbs文件转换成c++可用的头文件的参数选项./flatc -c --no-prefix -o ./../xmlToBinary/Classes ./dragonbones.fbs. 

usage: ./flatc [OPTION]... FILE... [-- FILE...]
  -b             Generate wire format binaries for any data definitions.
  -t             Generate text output for any data definitions.
  -c             Generate C++ headers for tables/structs.
  -g             Generate Go files for tables/structs.
  -j             Generate Java classes for tables/structs.
  -n             Generate C# classes for tables/structs.
  -o PATH         Prefix PATH to all generated files.
  -I PATH         Search for includes in the specified path.
  --strict-json   Strict JSON: add quotes to field names.
  --no-prefix     Don't prefix enum values with the enum type in C++.
  --gen-includes  Generate include statements for included schemas the
                  generated file depends on (C++).
  --proto         Input is a .proto, translate to .fbs.
FILEs may depend on declarations in earlier files.
FILEs after the -- must be binary flatbuffer format files.
Output files are named using the base file name of the input,and written to the current directory or the path given by -o.
example: ./flatc -c -b schema1.fbs schema2.fbs data.json

 

    二、xmlToBinary项目目录介绍。

      这里我主要讲两个文件xmlToBinary.cpp(Classes目录下)和BinaryParser.cpp(Classes/parsers目录下),其他文件都是Dragonbones定义的数据文件和数据解析文件。

      1、xmlToBinary.cpp

        这个就是如何实现从xml转换成二进制文件的过程(即c++对象的序列化过程)。原理很简单,过程比较繁琐。将xml文件先解析成c++对象,然后将c++对象转换成Flatbuffers对象存到本地。里面的每个转换过程代码都写的很明确,大家可以运行代码,然后断点调试查看。

      2、BinaryParser.cpp

        将二进制文件读取成c++对象(反序列化的过程)。代码已经写的很明确,都是简单的取值操作,没有很强的逻辑在里面。

 注:

    如果有比较细心的童鞋可能会发现我的.fbs文件中定义一个PointOption和Vec2Option,他们两出了类型不一样,其他都一样。这是为什么呢!因为早期我将坐标定义为结构体类型,在后来的扩展过程中没有找到Flatbuffers中压如结构体数组的方法,为了避免对以前代码的改动,我就加了一个坐标对象属性,又来解决Flatbuffers中压结构体数组的问题。如果各位在研究和学习中有解决这个问题,还望告知我。

 

 

谢谢各位的阅读!

各位有什么疑问可以直接在我的blog下留言或者是发送的我的个人邮箱relvin@qq.com。

 

posted @ 2016-05-31 16:37  Relvin  阅读(1843)  评论(0编辑  收藏  举报