UniRx の ObservableWWW 結果を gzip 圧縮で受け取る

サーバからの転送量を減らす

20090827-4

Unity3D でクライアント・サーバ型アプリを開発する際にサーバから受け取るデータ量を減らすために gzip 圧縮でデータを受け取る方法をメモしてみました。

具体的には WWW オブジェクト生成時に “Accept-Encoding: gzip” を付けるだけで OK です。

受け取ったデータの解凍には .Net の System.IO.Compression が使えればよかったんですが、何気に Unity3D で System.IO.Compression が使えなかったので、DotNetZip を利用してやってみます。

WWW へのアクセスは簡単楽ちんの UniRx を使用します。

プロジェクトの作成

プロジェクト名「HttpGzipTest」で新規プロジェクトを作成します。

20160107_01_000

UniRx のインポート

メニュー Windows -> Asset Store をクリックし、アセットストアを開きます。

20160107_01_002

アセットストアの検索窓に UniRx と入力し、検索結果の UniRx – Rective E… をクリックします。

20160107_01_003

UniRx – Reactive Extensions for Unity のページが表示されたらアセットをダウンロードし、インポートすれば OK です。

20160107_01_004

画面写真はすでにダウンロード済みなので「インポート」ってボタンになってますが、初めての時は多分「ダウンロード」になってると思います。

20160107_01_005

DotNetZip のダウンロード

インポートが完了したら次は DotNetZip です。

http://dotnetzip.codeplex.com/ にアクセスし、download をクリックして zip ファイルをダウンロードします。

20160107_01_006

zip を解凍したら zlib-v1.9-CompactFramework\Release の下の IonicZlib.CF.dll を Unity の Project ビューにドラッグしてインポートします。

20160107_01_007

これで準備 OK です。

WWW アクセスのテスト用シーンを作成する

Project ビューで 右クリック → Create → C# Script を実行し、C# スクリプトファイルを新規作成します。

20160107_01_008

名前は「HttpTest」にでもしておきます。

20160107_01_009

今回は手を抜いて、作成した HttpTest スクリプトを Hierarchy ビューの Main Camera にドラッグします。

20160107_01_010

HttpTest のソースコード編集

Project ビューの C# スクリプト HttpTest をダブルクリックし、エディタを開き、下記のようにします。

20160107_01_011

using UnityEngine;
using System.Text;
using UniRx;
using Ionic.Zlib;

public class HttpTest : MonoBehaviour {

    void Receive(WWW www) {
        if (www.bytes[0] == 0x1f && www.bytes[1] == 0x8b) {
            Debug.Log("=== gzip ccompress ===");
            Debug.Log(Encoding.UTF8.GetString(GZipStream.UncompressBuffer(www.bytes)));
        } else {
            Debug.Log("=== normal text ===");
            Debug.Log(www.text);
        }
    }

    void Awake() {
        ObservableWWW.GetWWW("http://www.yahoo.co.jp", new System.Collections.Generic.Dictionary<string, string>() { { "Accept-Encoding", "gzip" } })
            .Subscribe(Receive);
        ObservableWWW.GetWWW("http://www.google.co.jp")
            .Subscribe(Receive);
    }
}

実行してみる

20160107_01_012

サンプルは Yahoo と Google にそれぞれアクセスしています。

Receive メソッドで gzip 圧縮された HTTP レスポンスデータを解凍しているのですが、マジックナンバーで gzip かどうかを判定しています。

JSON とかでサーバからのレスポンスを受け取る場合は Select をかましてあげたりするといいですね。

ツイートツイート