この記事でのバージョン
Unity 5.2.2f1 Personal
Xcode 7.1
はじめに
ある時、作ってるゲームのメモリ使用量を確認したらえらい事になっていました。
使用メモリ 331MB |
主な原因はテクスチャで、単純に量も多いしサイズも大きかったのですが、
色々と改善したら使用メモリを結構減らす事が出来たので、今回はその方法をまとめた記事です。
使用メモリの確認方法
今回、使用メモリの確認はXcodeで行いました。
確認方法はアプリ実行中に、左側のメニューからMemoryを選ぶだけです。
なお、使用した端末はiPhone 6s Plusです。
Xcode以外にも以下のようなものを使って確認する方法もあります。
AllocationStats - Unify Community Wiki
テクスチャの設定
何はともあれテクスチャの設定が重要です。
Read/Write Enabled
テクスチャデータにスクリプトからアクセスできるようにする項目ですが、
なんと、これを有効にしていると必要なメモリ量が倍になります。
作成されたテクスチャデータは、テクスチャアセットとして必要なメモリ量は倍となります。必ず必要な場合のみ使用してください。
普通は無効になっているはずなのですが、以前これを自動で有効にしてしまってました。
必要な時だけ有効にしましょう。
Max Size
画像の最大サイズを決めるMax Sizeも出来るだけ小さくした方がもちろんいいです。
NGUIのアトラスならサイズを小さくしても、劣化するだけで表示するサイズは変わらないので
気にならない範囲で小さくしましょう。
間違っても1色の背景に1024とか指定しないように、
すいませんすいません。
というか1色なら画像の必要すらないという……。
Format
Formatも重要で、使用する画像によって最適なものを選ぶ必要があります。
間違っても全部True Colorでいいや、
なんてことしたらメモリ使用量もアプリサイズも肥大化しますからね。
すいませんすいません。
それで、メモリ使用量ですが色数を減らすといいっぽので、出来る限り16bitに。
RGB 16 bit
アルファは付かない 65000 色。圧縮された DXT フォーマットはメモリを削減し、一般的には見た目も良いです。256x256 テクスチャに対して 128 KB 要します。
ちょっと古いですが、こちらの記事がとても参考になります。
ここまで確認したところメモリを100MBほど減らせていました。
使用メモリ 223MB |
まだまだ多いですね。
一説によると(どこで聞いたか忘れた)、100MB以内なら良心的みたいな話らしいので、
それぐらいまでは減らしたい所です。
実装方法の改善
次に実装部分の改善です。
必要なだけ読み込む
当たり前ですが、使わない画像を読み込んでおくとメモリの無駄になります。
なので、UIのアトラスをシーン毎に分け、必要なものだけ読み込むようにしました。
アトラスの数は増え、アプリサイズが若干増える事はありますが、瞬間的なメモリ使用量は減ります。
他にもスプライトは先に読み込んでおかず、必要な時に必要なだけ読み込むようにしました。
まぁ、読み込みに時間がかかるから先に全部読み込んでおく、
みたいな場合もあると思うので、ここは臨機応変に。
シーン移動時にメモリ解放
使ってないメモリは解放せねば、
という事で以下のようにメモリを解放しています。
//GC System.GC.Collect (); //使ってないアセットをアンロード Resources.UnloadUnusedAssets();
メモリ解放時に処理落ちする事があるので、シーンを移動する時の暗転時に行っています。
これで確認したところメモリをさらに100MBほど減らせていました。
使用メモリ 115MB |
目標の100MB以内には届いていませんが、とりあえずこれぐらい減らせればいいかなと。
おわりに
アプリのサイズと同様にメモリの使用量も横着してるとすぐに肥大化しまいますね。
今後はゲームを作ってる最中にも意識していこうと思ってはいる次第です(:3っ)∋〜