Unity でアプリ作ってると気がついたらメモリ使いまくってるなんて事があるっぽいのでリソースの解放方法をいくつかメモ。特にスマートフォンなどのモバイル向けデバイスは適当に作ってるとメモリが足りなくてアプリが落ちたりする。機種変しろ
リソースの解放方法
状況に応じていくつかの方法があります。
Using を利用する
C# の機能にある Using を利用すると自動的に Dispose を呼び出し利用しなくなったリソースを解放してくれる。WWW クラスなんかで使うっぽい。
こんな感じ。
string filePath = Application.persistentDataPath + "/dlc.unity3d";
if (!File.Exists (filePath)) {
string url = "http://example.com/dlc.unity3d";
using(WWW www = new WWW (url)){
while (!www.isDone) {
yield return 0;
}
File.WriteAllBytes (filePath, www.bytes);
}
}
Dispose 呼び出すのもいいけど Using で囲ったほうが楽。
Resources.UnloadUnusedAssets()
現在使用していないアセットを破棄してくれる。
Resources.UnloadUnusedAssets();
特に引数とかはなく、とりあえず実行すれば何か破棄してくれる。ただし処理が一瞬止まったりするので動きのない場面で呼ぶ等、実行する場所は考えたほうが良さそう。
ハマケン100%開発: Unity: メモリ不足に陥ったらResourcesクラスのアンロードを試してみるAssetBundle.Unload()
Pro 向けだが AssetBundle を利用している場合も、使わなくなったり一度読み込んだら Unload できる。
このメソッドは第一引数に bool を渡す事ができ、true をいれると既に利用しているリソースも含め全てを破棄する。まだリソースは利用しているがメモリ節約したいという時は false を渡す。
// assetBundle からこれ以上読み込まない場合はこっち。
// 既にロードしたものは scene 上に残る。
assetBundle.Unload (false);
// OnDestory時などで全て削除してかまわない時であれば true を渡す。
assetBundle.Unload (true);
アセットバンドルからのオブジェクトをロード、アンロード / Loading and unloading objects from an AssetBundle / Unity - Unity Manual
いずれの場合にもプロファイラなどを見て実際に効果出てるのかを確認しながら実行したほうが良さそう。