MessagePackは、効率の良いバイナリ形式のオブジェクト・シリアライズ フォーマットです。
JSONの置き換えとして使うことができ、様々なプログラミング言語をまたいでデータを交換することが可能です。
しかも、JSONよりも速くてコンパクトです。
例えば、小さな整数値はたった1バイト、短い文字列は文字列自体の長さ+1バイトでシリアライズできます。
ゲーム作っていれば、任意の型オブジェクトを高速に圧縮してファイル保存し、高速に解凍して元の状態に戻したい場面に遭遇します。
今回はそんな場面で役立つ MessagePack を使ってみました。
使用方法は以下の通り
まず、次のリリースページより .zip ファイルを入手して解凍し、unity フォルダに入っている MsgPack.dll を Unity プロジェクトに配置します。
github.com
あとは、前回作った BinaryFormatter のシリアライズ機構
simplestar-tech.hatenablog.com
を次のように書き換えるだけです。
using MsgPack.Serialization; using System.IO; namespace Utility { public class BinaryUtil { public static void Seialize<T>(string path, T obj) { using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write)) { var serializer = SerializationContext.Default.GetSerializer<T>(); serializer.Pack(fileStream, obj); } } public static T Deserialize<T>(string path) { T obj; using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) { var serializer = SerializationContext.Default.GetSerializer<T>(); obj = serializer.Unpack(fileStream); } return obj; } } }
使い方は超・簡・単!
チャンク情報は主に ulong(8byte) x 65536 の情報を詰めているので、無圧縮なら 524 KB ということになりますが、この MessagePack の機能を使うと、およそ 130 KB まで圧縮されました。
MessagePack は高速性がウリなので、他の高効率圧縮のアルゴリズムよりゲームのセーブロードに向いていそうです。
(ちゃんと比較ベンチとれって同僚に怒られそうだな…ではこの辺で)