概要
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のパスに実行する簡単なシェルを作った