あなたのモバイルゲーム開発の最適化時間を数ヶ月節約する方法（メモリ編）

みなさん、こんにちは。こちらはUWA Technologies（略称UWA）です。

今日は「あなたのモバイルゲーム開発の最適化時間を数ヶ月節約する方法」の最後のパート「メモリ」についてご説明いたします。

前回の文章をまだ読まれていない皆様は、是非移動してご覧ください。
[「あなたのモバイルゲーム開発の最適化時間を数ヶ月節約する方法（レンダリング編）」](https://qiita.com/UWATechnology/items/cf942b051a11179300e2)
[「あなたのモバイルゲーム開発の最適化時間を数ヶ月節約する方法（UI＋ロード編）」](https://qiita.com/UWATechnology/items/4b2b11511cc447201bfe)
##メモリ
メモリパートに最も重要なのは**メモリの割り当て**と**メモリリーク**です。
ほとんどのプロジェクトでは、**アセットメモリ**と**Monoメモリ**という2つの大きなメモリ割り当てがあります。 ここでは、最初にアセットメモリについて説明します。

###アセットメモリ
UWAレポートでは、テスト中にテクスチャメモリの割り当てを記録できます。 大事なのは、**Monoメモリとテクスチャフォーマットです**。
<img width="1428" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4cfd4c9c-dc64-121a-6595-ed741cefce75.png">
また、メモリの詳細を知りたい場合は、クリックして詳細を表示できます。
<img width="1322" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/0e66f702-86d0-eb18-c783-407f44c6dc63.png">

###実例
これはゲーム「Kiwame」からのデータです。テクスチャの詳細情報を見ることができます。 この中に、「アセット名」、「メモリ割り当て」、「解像度」、「フォーマット」などが含まれます。NewUI1_rgbが16 MBで非常に大きいことがわかります。 開発チームはそれを チェックして、最適化する必要があるかどうかを確認できます。
<img width="952" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/f5077b05-6b19-aff6-3a62-08386979095f.png">
また、アセット管理にも注意する必要があります。表から1つ以上のアセットを選択、それらの使用情報がチャートに表示されます。アセットがいつロードされ、いつアンロードされるかを確認でき、メモリリークを分析することには非常に有用であります。

---
##メッシュ
次にメッシュの詳細を見に行きます。
<img width="731" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/9ea013ec-85c7-66b5-d871-3f3559eb0368.png">
<img width="770" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/2510f22a-d353-4228-0919-83ea4d6c1d37.png">
**アニメーションクリップ、オーディオクリップ、シェーダー、フォント、RT、パーティクルシステム**など、すべての詳細情報を直接かつ迅速に見ることができます。

###結果
<img width="860" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/369fae08-d922-9653-cff6-010a3b75cc5f.png">
これは 、テクスチャ、およびオーディオの最適化の結果です。

---
##Monoメモリ
<img width="1423" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/8f25a262-83e2-4deb-4b74-2392b2b43bdd.png">
二番目に大きいメモリは**Monoメモリ**です。

<img width="1437" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4c340314-9887-5663-620b-367c895d1d58.png">
このように、**全体的なMonoメモリ割り当てに注目すべき、メモリの合理性を確認する必要があります**。
<img width="1437" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6732f408-fd7f-d40a-5203-28fe49102310.png">
**UWAレポートは、関数のコールスタックと詳細なメモリ割り当てを示します。それで、重要な関数名をすばやく確認できし、コードで検索して最適化することができます。**

###結果
<img width="1156" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a23ec781-16d8-cfba-482c-a337e68d5b57.png">
こちらは結果です。**25日をかかって、Monoメモリは150MBから50MBに最適化されました。**

---
##メモリリーク
<img width="1437" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a083693a-de03-4e04-b0cb-ac69025985d8.png">
メモリ部分に、非常に難しい難問があります。それはメモリリークです。以前には、メモリリークを分析して解決するには、2〜3か月は常に必要でした。
UWAレポートでは、常駐Monoメモリを表示できます。*グラフにMonoメモリがこのように増える一方で、下がらない場合には、つまり、メモリリークが発生したということです。*
じゃあどうすれば修正できますか？ チャートの2つのサンプルを比較して、Monoメモリの増分を見つけます。
<img width="1420" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/0838d328-e5dc-bed3-9aeb-69631ec33048.png">
このプロジェクトでは、**メモリのほとんどの増加が、InstantateGamObjectという関数のInstantiateによるものであることがわかります**。
これらは、garbage collectedできない変異体です。 そして、開発チームは関数を直接チェックして、どのコンテナーがそれらを参照しているかを確認できます。その後、コードをすばやく最適化できます。

###結果
<img width="1046" alt="13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/319559da-06b9-2703-d1d6-aa491b3cba31.png">
これが結果です。 **3日後**、このプロジェクトでは、**メモリリークの問題がほぼなくなりました**。
<img width="1104" alt="14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/e905418b-a076-f14c-f838-9fe03f6f4752.png">
これは別の例です。 **ただ1日で、メモリリークの問題が改善しました。**

現在、中国でUWA GOTを使っているゲームプロジェクトは、**メモリリークの問題は約3日で大幅に改善できます。**
<img width="1434" alt="15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/adc5a6db-8b7e-923f-666a-f9d384f405f6.png">
過去のメモリリークの割合は約50％でしたが、**昨年、UWA GOTでMonoメモリ分析を開始して以来、割合は25％に低下しています。**

####今回、UWA GOTが日本のゲーム開発者たちに役立つことを願っています。

---
UWAおよびUWA GOTについてもっと了解したい場合には、[UWA公式サイト](https://jp.uwa4d.com/)に移動してください。
UWA GOTを使っていた[nowsprintingさん](https://twitter.com/intent/follow?original_referer=https%3A%2F%2Fwww.nowsprinting.com%2Farchive%2Fcategory%2FUWA%2520GOT&ref_src=twsrc%5Etfw&region=follow_link&screen_name=nowsprinting&tw_p=followbutton)も自身のブログでUWA GOTについて詳しく説明してしましたが、興味があれば[「やらなイカ？」](https://www.nowsprinting.com/archive/category/UWA%20GOT)に移動してご覧ください。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com