Android のメモリ管理を理解し、ゲームのメモリ使用量を測定するツールを設定したら、次のステップとして、メモリ使用量を積極的に削減して最適化します。 Android の厳しい制限内に収めることで、システムがゲームを強制終了するのを防ぎ、起動時間を短縮し、すべてのデバイスでゲームが適切に動作するようにします。
このガイドでは、ゲームのメモリ使用量を削減するための実践的な手法について説明します。特に、アセットレベルの最適化、エンジン固有の構成、メモリ管理のベスト プラクティスに焦点を当てます。
Unity でメモリを削減する
Unity のアーキテクチャ設計により、ネイティブ ブロック アロケータとマネージド ヒープが拡張されると、アセットが解放された後でも、エンジンはそれらのメモリページをオペレーティング システム(OS)にすぐに返すのではなく、再利用のために保持する傾向があります。具体的には、仮想アドレス空間(予約済みメモリ)はプロセスの存続期間中予約されたままになり、物理メモリ(RSS)は、ガベージ コレクション(GC)とトリミングのサイクルが数回行われるまで回収されません。そのため、一時的なメモリのピークにより、実際の使用量が減少した後も、常駐メモリが長時間肥大化する可能性があります。この動作により、ローエンド デバイスでメモリ不足(OOM)クラッシュが発生するリスクが高まり、ランタイムの安定性が全体的に低下します。
したがって、Unity のメモリ最適化は、エンジンの動作に合わせて調整された次の 3 つの柱からアプローチする必要があります。
- アクティブなメモリ使用量を制御して、メモリのピークスパイクを事前に防ぎます。
- テクスチャ形式とシェーダー バリアントを管理して、不要なアセットとネイティブ リソースがインスタンス化されないようにします。
- ランタイム コード構造をリファクタリングして、マネージド ヒープ上の不要な割り当てを排除し、GC の頻度とヒープの拡張を最小限に抑えます。
詳細については、Unity のメモリ最適化をご覧ください。