LoginSignup
6
6

More than 5 years have passed since last update.

FlatBuffersのtableに構造体(Class)を格納する

Last updated at Posted at 2014-09-25

概要

API使ってバイナリでの値渡しにconst char *で渡すのを想定した実装をテストする

-> 結果出来ませんでした。
バイナリ扱うのでサイズも渡さないと駄目でした。

ついでにuint8_t(unsigned char)で渡すことにしました。(^^;

FlatBuffersって何?

C++でデータを保存する(FlatBuffers編)
Google、FlatBuffersをオープンソース化: 効率の良いクロスプラットフォームのシリアライゼーションライブラリ
上記にまとまっている。
データの受け渡しにJSONを利用していて容量やパースの速度が気になる方におすすめ。
最近だと2014/9/17にC#に対応したとある。Unityで動くかは試していない。
C#のバージョン次第かと。
ベンチマークを見ると容量以外はProtocol Buffers LITEより優秀に見える。
今後使うシーンが増えると期待してみる。
Cocos2d-xへの導入も難しくない。何処に設置したかは下記にメモだけ残しておきます。

調べたこと

FlatBuffersのtableに構造体の格納方法。
下記を読めば書いてある。やりたいことだけ抽出した内容を記載。
monster_test.fbs
test.cpp

block.fbs
// example IDL file

namespace schema;

enum Color:byte { Red = 0, Green, Blue = 2 }

union Any { Block }  // add more elements..

struct Break { 
  blockNum:short;
  color:Color = Blue; 
}

table Block {
  peerId:string;
  blocks:[Break];
}

root_type Block;
flatbuffers::FlatBufferBuilder builder;
Break breakBlock[] = { Break(1,Color_Blue),Break(2,Color_Red) };
auto _breakBlock = builder.CreateVectorOfStructs(breakBlock, 2);
auto peerId = builder.CreateString("hoge");
auto __blocks = CreateBlock(builder,peerId,_breakBlock);
FinishBlockBuffer(builder,__blocks);

auto str = std::string(reinterpret_cast<const char *>(builder.GetBufferPointer()),
                           builder.GetSize());
builder.Clear();

auto block = GetBlock(str.data());
auto tests = block->blocks();
for (auto it = tests->begin(); it != tests->end(); ++it) {
    log("%d %d",it->blockNum(),it->color());
}

設置した場所

  • cocos2d_libs.xcodeproj -> external/flatbuffers にinclude/flatbuffers 以下を設置した
  • cocos2d_libs.xcodeproj -> external/flatbuffers/schema を作ってfbsとスキーマを設置した。

あとは、flatcをschemaのパスに実行する簡単なシェルを作った

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6