Unityのゲーム開発においてメモリ不足は問題になりやすいです。
ただメモリ改善を行おうにも、何から始めていいか悩む人も多いかと思います。
ここでは、普段自分が行っているメモリ改善のその一歩を記したいと思います。
※本記事は改善していくための手法がメインとなります(具体的な改善方法には触れません)
目次
はじめに
まずはじめに
「開発段階でメモリ使用量を試算し、問題にならないように作る」
これが最も大事です。すでに出来上がったものに対して修正を加えるのは大変ですしバグのリスクもあります。なので、開発段階での適切な見積もりが重要です。
- 想定されるTextureの総メモリサイズはどのくらいか?
- 大量に読み込むリソースはあるか?
- 頻繁にメモリ確保するオブジェクトはあるか?
その上でどうしても必要になった場合は、メモリ改善を行うことになるかと思います。
(特にソシャゲは更新頻度に対して改善が追いつかないことが多いかもです。。)
FPSMemoryFriends – 問題にならないように作る

適切な見積もりを行っていれば、開発中はそれほど問題はないかと思います。
ただメモリリークや仕様変更など不測の事態は発生します。
そんな時に、自分は上記アセットでメモリを視覚化して問題に気づけるようにしています。
MemoryProfiler – 問題の大枠を把握

メモリが肥大化してしまった場合、まずはざっくりと問題の大枠を把握するといいです。
そんな時に便利なのがUnity2018から新たに追加されたMemoryProfilerです。
これを使うと、ゲーム中のメモリがどのように使われているか分かりやすく表示出来ます。
MemoryProfiler導入手順 |
---|
|
adb shell dumpsys meminfo – 問題の地点を把握
# 1秒おきにアプリのメモリを調べるコマンド
while true; do adb shell dumpsys meminfo {パッケージ名}; sleep 1; done

問題の大枠を把握したら、具体的にどの地点でメモリが増えているか調べます。
自分はそういう時にAndroidのadbコマンドで調べています(PCと実機で結果が変わりやすいので、実機で調べることが重要です)。
ProfilerやiOSのXcodeで調べてもいいのですが、Profilerを使うにはDevelopment Buildが必要だったり、iOSのビルドは時間が掛かったりするので、まずは簡単に調べられるadbコマンドを使用しています。
Profiler – 問題の詳細を把握

問題の地点が大体分かったら、その付近でのメモリの詳細をProfilerを使って調べます。
「Window>Analysis>Profiler」を表示し、「Deep Profile」を選択(DeepProfileを入れると、メソッド内のどこでメモリが消費されているかまで調べることが出来ます)。
問題の地点でProfilerのMemoryグラフを確認し、波形が高くなってるところでCPUグラフのフレームを選択。
下のTimelineをHierarchyに変更し、「GC Alloc」が大きい処理を確認。
これでメモリを大量に消費してる処理を特定出来ます。
Profiler.BeginSample~EndSample – 問題の部分を把握
public Monster()
{
Profiler.BeginSample("[Monster.Init]");
Init();
Profiler.EndSample();
PlayAnimation();
}

問題の詳細まで把握すれば、あとは改善していくだけですが、もう一歩踏み込みます。
Profiler.BeginSample~EndSampleでプログラムの特定部分を囲うと、Profilerにその部分の情報を表示させることが出来ます(TimelineやHierarchyにBeginSampleで指定したラベルが表示される)。
あとは粒度を細かく調整していけば、メモリ肥大化の原因を特定出来ると思います。
最後に
まぁ原因を特定できたとしても、直せるかどうかは別なんですけどね(´;ω;`)
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【Unity】CPUプロファイラでパフォーマンスを改善する 前編
【Unity】CPUプロファイラでパフォーマンスを改善する 後編
Profilerの使い方と最適化の目安の付け方(前編)【Unity】【Unite 2017 Tokyo】【最適化】
Profilerの使い方と最適化の目安の付け方(後編)【Unity】【Unite 2017 Tokyo】【最適化】
〜オセロを作りながらゲームのプログラムを学ぼう〜