MessagePack というデータ形式がある。データをバイナリにシリアライズ/デシリアイズするものだが、Json などの形式よりデータのサイズが少なく且つ高速であるという利点がある。
MessagePack: It's like JSON. but fast and small.
自分も名前だけは聞いていたがちょっと見た感じ Json より良さそうと感じたのでさっそく Unity で利用してみる。
サーバに MessagePack を出力するスクリプトを設置
今まで Json で取得していたデータを MessagePack に置き換える事を目的としているので、Unity のスクリプトを書く前にサーバ側に MessagePack を出力するスクリプトを置いておく。
以下のような ruby スクリプトを cgi が実行できる箇所に配置した。gem install msgpack しておく必要がある。
#!/usr/bin/env ruby
require 'cgi'
require 'msgpack'
msg = ['金剛', '比叡', '榛名', '霧島'].to_msgpack
#msg = [1024,2048,4096,8192].to_msgpack
cgi = CGI.new()
headers = {'type' => 'application/x-msgpack', 'charset' => 'x-user-defined'}
cgi.out(headers){msg}
ブラウザでアクセスすると保存するか?と聞かれるが無視してインスペクタで Response を開くと・・・
読めるわけなかった。
msgpack-unity
Unity で MessagePack を利用するには msgpack-unity を利用するのが良さそうだ。単にぐぐってすぐ出てきたという理由だがこれを利用してみる。
src 以下を全部 Unity 上に取り込めば使えるようになる。
取り込んだらスクリプトを書く。C# を使ってます。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
public class MsgpackTest : MonoBehaviour {
IEnumerator Start () {
WWW www = new WWW("http://example.com/msgpack.cgi");
yield return www;
MsgPack.BoxingPacker packer = new MsgPack.BoxingPacker();
IList msg = (IList)packer.Unpack(www.bytes);
for (int i=0; i<msg.Count; i++) {
Debug.Log(Encoding.UTF8.GetString((byte[])msg[i]));
}
}
}
以下のように Console で確認できる。
数値であれば msg[i] をそのまま出力できるのだが日本語は byte[] のままだったので Encoding.UTF8.GetString を使用して byte[] から string へ変換している。面倒くさいんだけどどうにかならないんだろうか。
コメント