2,495 views
1

FlatBuffersを使い倒すの巻(1)

突然ですが、FlatBuffers使っていますか?

FlatBuffersとはGoogleが開発した最速(現段階で)といわれているクロスプラットフォーム対応のシリアラゼーションフォーマットのことです。

https://google.github.io/flatbuffers/

特徴は?

FlatBuffersはデシリアライズが鬼速いという特徴があります。

これはデシリアライズ自体が高速という意味ではなく、いわゆる遅延ロードに近い仕組みのためです。つまり、アクセスされて初めて必要なデータを取り出すということです。

大抵データというのは、毎度毎度、全体をフルスキャンして使うというケースは稀なわけで、必要になった時だけデシリアライズされるなら、余計なCPUリソースを割く必要がないですからね。このことから非常にエコなフォーマットであるということが理解いただけるのではないでしょうか。

また、メモリの使用効率的にもエコです!

FlatBuffersのデシリアライズは、バイナリデータを一旦メモリに一度展開し、C/C++でいうポインタのような方式でアクセスしていきます。

一方、JSONの場合、まずJSONデータをメモリに展開した後、デシリアライズのためのメモリを確保し、デシリアライズ処理を行う(使用するかどうかわからない要素も含めて)流れになります。デシリアライズ用のメモリとその処理分が丸々FlatBuffersでは必要のない処理となります。

これがFlatBuffersのデシリアライズが速い&低使用メモリというカラクリなのです。

何に使えるの?

弊社では主に以下の用途に使用しています。

  • ゲームなどのマスターデータファイル(暗号化して使ってます)
  • クライアントとサーバー間のメッセージングフォーマット

それぞれ順を追って解説していきますね。

どうやって使うの?

.fbsという特殊なスキーマ定義ファイルを作成し、flatcというコマンドラインツールでコンパイルすると、目的の言語に対応したソースコードが自動生成されます。

何はともあれ、まずはコマンドラインツールを粛々とインストールしましょう。

Homebrewでインストールするのが簡単です。

インストールを確認

これでインストールは完了です。

スキーマを定義しよう

FlatBuffersはスキーマの定義が必要です。

スキーマは.fbsファイルという独自の定義ファイルを作成します。

スキーマ定義とかめんどくさいなと思ったあなた!定義はとても簡単ですし、クライアントとサーバーで同じバッファフォーマットを扱う際にとても幸せになれるルールになりますよ。スキーマ定義はインターフェースの仕様としてのドキュメントにもなりますしね。

そんな感じで自分自身を納得させましょう。

stage.fbs

とりあえず、こんな感じのスキーマ定義を作ってみました。

StageEntityというテーブルには、Id、ActorId、AppearRateという3つの要素を定義し、それぞれコロン(:)で変数の型を指定しています。

次に、Stageというテーブルを定義し、Version、Entityという要素を定義しています。ここで、Entityは:[StageEntity];という記述があるのがありますね。これは、EntityというのはStageEntityというデータ型の配列ですよという意味になります。

最後に、root_type Stageを定義します。Stage->StageEntityという親子関係のルートがStageなので、Stageを指定します。

ここまできたらコンパイルしてみましょう。

コンパイル

flatcを使って.fbsファイルをコンパイルします。

flatcには実に様々なオプションがあり、いろんな言語でそのソースコードを吐き出してくれます。全部解説していると日が暮れるので、ここでは、まずC#用のコードを吐いてみることにしましょう。

スキーマ定義に問題がある場合はここで何らかのエラーが表示されます。何も表示されなかったら正常にコンパイルされているはずです。返事がないというのは無事な証拠と言いますからね!

ファイルを確認してみよう

namespaceで定義してある名前のフォルダが生成されて、その中にファイルが生成されます。

確認できましたか?

おめでとうございます。これで準備ができました。

でも、疲れたので今日はこの辺で。

続きます

シェアする

プロフィール

たみ Lv 34

サーバーエンジニア的な

HP : 384 /65535

SP : 256 /32768

新技術を積極的に実戦投入していくエンジニア。
ライフワークは育児とインディープロジェクトの企画・開発・販売。

▼ おすすめ記事

  • クリエイティブ・オブ・ゴッド

    『スージー』3D化!

  • クリエイティブ・オブ・ゴッド

    E3に新作の情報を公開かも!

  • 開発の謎

    コンテナをゲームインフラに実践投入した話(1)

  • クリエイティブ・オブ・ゴッド

    【第五回】21歳ぴちぴち新社会人が語る★アニメ映画の本気を見た「”傷”物語②」