3
6

More than 5 years have passed since last update.

[Unity] JsonUtility vs ZeroFormatter vs FlatBuffers (ローカルデータの永続化)

Last updated at Posted at 2016-11-20

内容

ZeroFormatterにUnion機能が実装されたため
前回をもとにUnionで再実装してテストをする。

業界主要なデータフォーマットのJsonとの比較がないとパッとしないだろうということで
Unityの標準Jsonクラスを使用してテストしてみました。

テスト内容はFlatbuffersとの比較処理で使用したものをそのまま使う。
(http://qiita.com/akerusoft/items/bf43b6382f30c43595b4)

使用したプログラム
https://github.com/akerusoft/UnityTestZeroFormatter2

環境

Unity 5.4.2p4
ZeroFormatter 1.4.2

IL2CPPでビルド
Android 4.0.4 (低スペック機)

結果

一般的なデータフォーマットとの比較としてJsonUtilityも追加してみました。
シリアライズとデシリアライズを1000回、それぞれのフォーマットで実行した結果です。

JsonUtility ZeroFormatter FlatBuffers
1 1,298 458 489
2 1,292 459 538
3 1,273 510 524
4 1,292 508 479
5 1,270 439 519
6 1,280 444 477
7 1,256 475 478
8 1,276 468 510
9 1,275 458 507
10 1,201 434 466
Average 1,271.3 465.3 498.7
Max 1,298.0 510.0 538.0
Min 1,201.0 434.0 466.0
JsonUtilityとの比較
Average 1.00 0.37 0.39
Max 1.00 0.39 0.41
Min 1.00 0.36 0.39
データサイズ 96 65 84

FlatBuffersとZeroFormatterは、ほぼほぼ一緒ですね。
もうこれ以上、速くするにはデータによって最適化されたフォーマットなどではないでしょうか?

JsonUtilityは速度面ではなく柔軟性の高さが売りですので
この結果だから使用しないというわけではなく、速度を気にしない箇所では使っても問題ないと思います。

注意点

フィールドの追加

ZeroFormatterはフィールドの追加や削除はできるので
ここでの実装のようにバージョンを分けるのは「大きな変更があってリセットしたい」ってとき。

ZeroFormatterでUnionを使用するときの注意点

シリアライズするときに親クラスを指定しないとうまく出力できない。
https://github.com/neuecc/ZeroFormatter#union

今回でいえば下記のような実装。

var bytes = ZeroFormatterSerializer.Serialize<MonsterDataBase>(data);

感想

前回のコードは残してテストしようとしたがzfc.exeで事前コード出力をすると怒られてしまったので
コードを書き直して実装しなおした。

また、同名のenum型があると出力されたクラス名が重複してしまうっぽい。

仕様だけみてたら気が付かなった実装の注意点に気が付いてよかったですね。
実装の注意点だけヒューマンエラー入りそうで心配だったけども、
自前の実装をしないで異なるデータタイプを扱るのはよかった。

3
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
3
6