どこかのだれかへ

ボク、プログラマ。

バイナリデータを拡張性高くするためにXmlみたいな構造を作ってみた感想

バイナリデータって拡張にすごく弱くて、以前苦労しました。バージョンごとに構造体を書いていて管理が面倒でコードも汚くなっていきました。

そこで考えました。key-valueみたく、識別子・サイズ・値を1セットとして、すべてのメンバーやブロックを構成することで、自由にパラメータを追加したり削除することができるんじゃないだろうかと。つまり、JsonXmlのバイナリ化です。

仕事でやる機会がなかったので、現在家で開発中のゲームのフォントデータで採用してみました。

で、実際試したところ、

  • 書くのがめっちゃ面倒
  • ファイルサイズがでかくなる
  • 読み込みが遅い

という問題が出たので止めました。

書くのがめっちゃ面倒、に関してはおそらくXmlからコードに変換するツールとか作れば解決できるとは思います。

実は同じような構想のフレームワークはすでに存在していて、Message PackやGoogleのProtocl Buffersが該当します。Protocol Buffersを見つけたときは「まさにこれだ!」と思ったんですが、生成されるコードが非常に大きく複雑でわかりにくかったので止めました。もっとシンプルなものが欲しかったです。

ファイルサイズがでかくなる、はそりゃ当然で、全部の変数にID(4byte)とサイズ(4byte)を付けたためです。4byte整数1つのために8byteつけりゃ当たり前です。ちなみに当初924KBあったフォントデータは、現在ベタなやり方でやり直した結果、245KBになっています。差がひどい!

読み込みが遅い、も当然で構造体のコピーとメンバ一つ一つswitchに分岐して読み込むじゃ全然違うよねっていう。これは測定していないのでなんともですが、まあ書くのもしんどいです。

つまり拡張性を得るための犠牲がでかすぎたので止めました。今はベタに構造体並べたフォーマットでやっています。フォーマットが変わったら?もう全コンバートでいいんじゃないですかね。

でもいつかは、シンプルで、追加に強いバイナリフォーマットというのを考え出したいところです。