Unityパフォーマンス最適化シリーズ――アセットのメモリリーク

4年前、Unityの各主要なモジュールのパフォーマンス最適化知識(初心者向け版)を1つずつ説明しました。近年、エンジン自体、ハードウェアデバイス、製作基準などのアップグレードに伴って、UWAは引き続き規則や方法を更新して、各開発者に提供しつつあります。「アップグレード版」のパフォーマンス最適化マニュアルとして、Unityパフォーマンス最適化シリーズ】はより多くの開発者が利用できるように、シンプルでわかりやすい表現を心がけています。今回、アセットのメモリリークに関連する知識を共有します。

メモリリークは一番出やすい問題ですけど、出たのは一番怖いとも思われませんか。それはなぜでしょう?

考えたら、リークボトルネックを特定するまでに、リークの程度はどうだろうと全く予想できない、オンラインのある時刻で集中的に爆発するかなと心配しているからかもしれません。「こっちのユーザーは、三時間続けて流暢にゲームをやっていたのに、3~4時間になったら、ますます動かなくなってしまいました。それは全く予想出来ていませんね。」というフィードバックにあたって、今回はそういう疑問を解決しましょう。

UWAの実機テストレポートにもUWAレポートにも、アセット使用のトレンド図があります。もし下図のような絶えずに上昇するトレンドが出たら、十分な注意が必要です。

またこういうように、節ごとに上昇します。

このような状況になっていたのは、開発チームはローディング完了のアセットに対してキャッシュしておいたが(例えばContainerの中に入れるとか)、シーンを切替る際に、それをRemoveしたりまたはClearしたりしていません。したがって、エンジン自体でも、手動的にResources.UnloadUnusedAssetsなどの関連するAPIを呼び出しても、それをアンインストールできません。そして、アセットのリークが引き起こされました。

それでは、常用のアセットメモリリークをチェックする論理を紹介します。


 

1.アセットのライフサイクルに注目する

すなわち、各アセットがプロジェクトの実行中での使用範囲を知ることです。レポートの「アセット詳細」パージには、実行中に現れたアセットの情報が見えます。指定されたアセットを選択すると、生命トレンド図にローディングやアンインストールされたシーンが見えます。

この機能は、主にどのようなアセットはメモリに常駐するかを素早くチェックし、さらにそのアセットはプリロードなのかリークアセットなのかを判定することに用いられます。よく見られるLoading図、Login図は、(下図のように)、メモリの使用が大きいから、常駐メモリにする必要がありません。


 

2.リークをチェックする具体法>>シーン・フレーム アセットの比較

通常、プロジェクトのアセット数は数千で、どのようにリークを科学的にチャックしますか?もっと早くリークがあるアセットを探し出し、以下のようないくつかの方法でアセットの対照を行います。

1)同類のシーン・同じシーンの比較:相違アセットを注目する

同類のシーン・同じシーンのアセットは一般的に固定的で、違った時刻の同じ種類・同じシーンの相違アセットを比較し、それらの存在は合理的かどうかを判断するだけで、リークアセットがあるか、あったら具体的にどのアセットなのかを判定できます。

2)異類シーンの比較:共有アセットを注目する

常駐アセット以外、異類のシーンが使用しているアセットは完全に違っています。両類型のシーンの共有アセットを比較して、それは常駐アセットであるかどうかを判断します。常駐アセットでないと、リークアセットであるかもしれません。

3)相違フレーム間の比較

他に、相違フレーム間の共有アセットや専有アセットを比較して、共有項・相違項は合理的であるかどうかをチャックできます。

方法が適切で、特定が正確なら、修正はかなり早いですよ。

同時に、平常に長時間のテスト例を用意しおきれば、りーっくを問題を避けることができます。多くの開発チームは便宜のために、ただ10~15分に実行すると済みます。実は、これらのテストサンプルはとても十分ではありません。こちらの方はできるだけゲーマーのリアルなシーンを復元して、最適化の階段ではできるだけ十分なテストを行います。

もちろん、もっといい方法として、自動化スクリプトによって回帰テストをします。例えば、初心者の最初の30分、コピーの長時間オンフックなどのようなものは自動化スクリプトによって代替されます。それに、UWAのPipelineサービスは、多端末の自動化テストをサポートし、長時間テストのニーズにも十分に満たします

 


 

UWA公式サイト:https://jp.uwa4d.com

UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式Q&Aコミュニティ(中国語注意):https://answer.uwa4d.com