[Unity/Golang] 環境間でデータを圧縮して解凍してみる

お世話になっております。
しゃまとんです。

今回は、通信時に圧縮したデータを相互に送り合って使えるようにしたいなと思って試してみました。データを小さくしたりリクエストの回数を減らしたほうがいいですよね。

今回もサーバ側はGolangです。

環境
Unity2018.1f1
Go1.10

まずはUnity側です。
テキストデータを圧縮し、Base64化したものをサーバーにPOSTするものを作りました。
またサーバーからのレスポンスを受け取って解凍するようにしました。

圧縮の処理ですが、今回は外部DLL等を入れることなく使えるものを利用しました。
簡単ですが、このような感じです。

次にサーバですが、Unity側と同じ圧縮アルゴリズムを利用して処理を実装しました(当然ですが)。実装の際、結構ハマっていたポイントがあるのですが、なぜかunexpected EOFというエラーが出てしまっていました。原因は、圧縮処理を行うwriterのCloseを行わずしてデータを返却していたことでした。

これが結構厄介なところで、Goだとよく defer writer.Close() とかするのでそれでよいと思い込んでいたのですが、Closeを行ってからじゃないと正しく処理されたデータを取得することができません。陥りがな罠に自分もハマっていました・・・。

処理自体はリクエストが来たらパラメータの解凍とデコードをして、その値プラスで追加メッセージをいれて、エンコードと圧縮をするようなものです。

これでサーバ側の起動(go run server.goなど)しておいて、Unityを実行してみます。
下のような感じで、サーバで文字が追加されたものを解凍することができました。

これで何か大きなデータをやり取りするときは相互にデータサイズを減らしていけそうです。
以上です。

■ 参考
【C#】文字列->圧縮処理->BASE64->解凍処理->文字列な処理コード
GO言語のcompressパッケージで陥りがちな罠