simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:MessagePackをオブジェクトのバイナリ圧縮として使う

MessagePackは、効率の良いバイナリ形式のオブジェクト・シリアライズ フォーマットです。

JSONの置き換えとして使うことができ、様々なプログラミング言語をまたいでデータを交換することが可能です。
しかも、JSONよりも速くてコンパクトです。
例えば、小さな整数値はたった1バイト、短い文字列は文字列自体の長さ+1バイトでシリアライズできます。

出典:https://msgpack.org/

ゲーム作っていれば、任意の型オブジェクトを高速に圧縮してファイル保存し、高速に解凍して元の状態に戻したい場面に遭遇します。
今回はそんな場面で役立つ 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 は高速性がウリなので、他の高効率圧縮のアルゴリズムよりゲームのセーブロードに向いていそうです。
(ちゃんと比較ベンチとれって同僚に怒られそうだな…ではこの辺で)