テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Uniteセッション「ネイティブアプリ時代の ローカルデータ管理入門」の補足

先日自分が担当したUniteのセッション「ローカルデータ管理入門」について、上手く説明出来なかったと思うので補足しておこうと思う。

スクリーンショット 2013-04-19 0.28.50


「webデータを取得しよう」の補足

この部分は、単純にjsonを使うのを止めて欲しかった。
理由は単純で、実行速度・消費メモリ・ファイルサイズ・全てにおいてjsonは余りにも勿体無い。
と言うのも

・mini jsonはmessage packと比較して2倍近く多くメモリを消費する
jsonはmsgpackと比較してシリアライズ/デシリアライズの時間が大体4倍近く遅い
jsonのファイルサイズはmsgpackと比べて大体10倍近く大きい

単純にサイズが小さければダウンロード時間を減らし展開メモリを少なくて済むし
単純にシリアライザ・デシリアライザが短ければ処理時間も短縮できるし、
単純に消費メモリが少ないほうが良い。
サーバー側としても、処理時間と通信帯域を節約できて経済的。

ローカルに保持できるならば最速/省メモリはScriptableObjectな訳だけど、
とりあえず手軽だからと言ってjson使いまくるのはどうかと思う・・・って話だった。

ちなみに試したmsgpackはmsgpack-cli。もう一つはパーサーを書かなくても良い代わり、微妙に遅い(それでもjsonより概ね早い)

msgpack-cli
https://github.com/msgpack/msgpack-cli


「データを保存しよう」の補足

まずPlayerPrefsの保存についてPlayerPrefsに保存したデータは起動時に全て読み込まれると話したが、実はこれ、PlayerPrefsにjsonを突っ込んだバカが居たため発覚した。
単純な話、ここにjsonを突っ込みmini jsonで展開すると、それこそアホみたいにメモリを食う。それを止めて欲しかった。

正直PlayerPrefsに4byteや8byteのデータを投入しても大して問題にはならないし誤差のレベル。ここでは単純にPlayerPrefsは簡単に使えるけれどあまりヘビーに運用するなと説明したかった。

それと、ファイルをローカルで保存する方法については単純にAssetBundleでjsonを運ぶのを止めて欲しかった為。

あと意外と知られていないことだが、LoadFromCacheOrDownloadでキャッシュしたデータは150日で削除される。なので、本当に必要なデータはローカルに保存しておく必要がある。


「ファイルを暗号化しよう」の補足

要するにトリプルDESではなくAES使えって話。jsonの復号化/暗号化に時間を取りすぎてるので。
本当はテクスチャにスクランブル付けてシェーダーに復号化を付ける事で、ロード時間を抑えつつ暗号化も・・・という話をする予定だった。


「ファイルを圧縮しよう」の補足

この章では、AssetBundleの圧縮を使ってjsonを小さくして配信しようとする人達に「AssetBundle以外の圧縮を提案」したかった。まあUnityは圧縮が使えない事が根底の問題だと思うが。

というのも、言っていた通りAssetBundle.LoadFromCacheOrDownloadはキャッシュしたAssetBundleを上書きしないためファイルサイズを増加させる傾向がある。これはCacheCleanしないと消えないので、実質消せない。個別には消せないのだ。なのでjsonのようなデータはAssetBundleではなくZipで圧縮・ダウンロード・解凍・ローカルで管理といったフローをちゃんと作ってもらわないと、後で確実に痛い目にあう。

ついでに言えば、圧縮済みAssetBundleをキャッシュ保存しない場合、読み込む際に「圧縮済みAssetBundleのファイルサイズ+展開済みAssetBundleのファイルサイズ+取り出したデータのサイズ」分のメモリを消費する。なので、自前で管理するようにZipでAssetBundleを固めて管理するといった方法も提供したかった。


「処理を止めないためには」の補足

これもjsonの話で、Awakeでjsonを展開して「インスタンス作るの超遅い!」と言う人が後を絶たない。勿論Awakeで展開しないとデータが引っ張り出せないので、Awakeでやるのは納得出来る。しかし、アプリを止めたくないのであれば非同期でやれし・・・という話だった。

またGCについては、Json miniにてインスタンスを生成/削除すると大量のゴミが発生するため、GCのスパイクが酷いことになる。だからjson使うなよ といった意味も込められていたりする。

それと、以前どこかの誰かが「Unityはスレッド使えない」と言っていたので、それの補足でもある。まあ使いにくい事には違いないんだけどね。