IL2CPPのメモリの問題

今回の主な話題：

1）IL2CPPのメモリの問題

2）Logによるメモリリーク

3）ProfilerのBuilt_in Resourcesのメモリ

4）Huawei P30ビデオの再生が異常

5）UWAGOTに関する疑問

---
##Mono
**Q： Q&AシリーズにIL2CPPとMonoとの比較があって、IL2CPPのメモリ使用量は高すぎると下落することに気づきました。これに関して、Unity技術者に尋ねました：Unityには独自のGCメカニズムがあります。頻繫的にオペレーティングシステムからメモリを請求・解放することを避けるために、Reserved Monoの値は一定的な区間内に保持し、ある特定の条件を満たす限り、または特別な状況では、GCが初めてトリガーされます。**

**またPerfDogの技術者にも尋ねたところ：メモリプール管理ロジックはいっしょで、上層管理に属します。IL2CPPとMonoとも、中間言語以外は、同じく高すぎると下落しません。**

**他の技術者にも尋ねましたが、IL2CPPのメモリ使用量は高すぎると下落すると答えました。今は非常に混乱していて、回答していただけませんか。**


>
A：いわゆるメモリが上昇するだけで下落しないことは、主に2つの指標とかかわっています。1つはProfilerのReserved Monoで、もう1つはデバイスメモリ（PSS）です。これを説明する信頼できる文書は実際にはないので、実際のデータで説明しましょう。
>
まず（Reserved Mono）について、

>１、Script BackendがMonoの場合、古いバージョンのMono 2.xまたは新しいバージョンで.Net 3.5（Runtime Version）を選択すると、この値は上昇するだけで下落しません。たとえば、このUnusedデータ、すでに非常に高いですが、下落することはありません。
![4 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/cd6ff14c-de15-d03e-8de9-3ecfc9d6c22e.png)
２、同じくScript BackendがMonoの場合、.Net 4.x（ランタイムバージョン）を選択すると、この値を下げることができます（ただし、どのバージョンから開始したかはわかりません）。たとえば、このデータで、ドロップされますが、ドロップ操作が頻繁に実行されないことがわかります。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/1ccdfde2-959a-ef6e-f970-d7ff70ae6f08.png)
３、また、Script BackendがIL2CPPの場合、この値も減らすことができます。たとえば、このデータは上記の状況とあまり変わらないようです。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c33d49c2-6902-57b6-3929-52c384c77ed1.png)
デバイスメモリについては、Androidシステムのメモリ管理メカニズムに関連しています。UnityがReserved Monoを減らすことによって、自身のメモリ使用量が減少されました。それても、システムがこのメモリをすぐに解放しないから、ここでの動きは明らかにしがたくなります。


##Memory
**Q：2時間以上実行し、UWA GOTで確認してから、最大のメモリリークがまさかDebug.LogWarningで発生しました。これは合理的でしょうか？**
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/71e7b3e5-17a9-dea8-1d9b-1e1edb7e8e10.png)
>
A：それは、Logがインデックス付けされていたかもしれません。例えば、グローバル変数によってインデックス付けされました。それに、Logがまだ増加しつつあっています。


##Resource
**Q：実機でデバッグする場合、ProfilerのBuilt_in ResourcesにArialフォントの使用のようなことが表示されます。この部分のコストに注意する必要がありますか？**

>A：通常は必要ありません。Arialフォントなどのように、そのほとんどは、Development Buildによって導入されています。

##Video
**Q：Unity 2018.3.7では、UnityのVideoPlayerを使用してビデオを再生します。プロジェクトとAndroidプロジェクトは統合されており、Huawei P30ではビデオを再生できません。**
>ビデオフォーマットはMp4ファイルです

>ビデオはHuawei P30で個別に再生できます

>ビデオはUnityプロジェクトのStreamingAssetsに配置されます（統合の問題により、VideoClipを使用するとすべてのAndroidスマートフォンでも再生できなくなるため、このディレクトリに配置され、URL経由でVideoPlayerに渡されて再生されます）

**誰か解決方法を教えてくれませんか。Huawei P30も持ち方だったら、テストしてくれませんか。または「実行中に再生できない」メッセージのヒントをくださいませんか。感謝します！**
>A1：私たちも同じ問題が発生しました。以上のように解決してみましたが、

>解像度の低下、ビットレートの低下

>Assetディレクトリに置き、内倉トランスコードを使用する

>ファイル形式の変更（WebM）

>Androidによって設定されたハードウェアでデコードする

>いずれも解決しておらず、リモートデバッグで異常は見られません。その後、ネイティブのVideoPlayerをあきらめて、再生プラグインに切り替えました。その方法で類似の問題はなく、現時点では正常に見えます。Unity内蔵のデコードは一部の機種に適用しないと思いますが、他の回答を待ちます。

---

>A2：H.264メインプロファイル4.1 / CABACなし/ 2000Kbps / 720p、私たちのプロジェクトはこのビデオフォーマットの配置を使用しています。基本的に問題はありませんが、iOSのクラッシュ率は約3％であり、完全に解決できません。AndroidでES3.0をサポートしていない（再生されていない）デバイスを除外した後、非常に安定しています。さらに、国内の主要メーカーでよく使用されているAV Proプラグイン、または日本人でよく使用されているCRI Videoプラグインを検討してください。

---
##Atlas
**Q：アトラスの名前はChapterですが、UWA GOTのAssetsのTexture列に, ChapterというNameが表示されません。これの理由は何でしょうか？**
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/3e257f2f-8c24-7128-e675-01b66d99bc4e.png)
>A：アトラス合併が有効にならない可能性があります。このオプションをチェックできます。
>![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/46bf91c6-13ff-4085-391d-5d6b36da094b.png)

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

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com