BLOGブログ

2022.03.23UE4UE/ Debug

[UE4]Memreportを活用しよう!

執筆バージョン: Unreal Engine 4.27

こんにちは!
開発をしているとこんな場合がありませんか?
「メモリがカツカツでうまく動かないけど原因がわからない」
「メモリリークしてないか調べたい」

そんな開発者のために、今回はMemreportについて紹介します!

 

Memreportとは?

Memreportとはその名の通りメモリの報告書を出力してくれます。
コマンド1つで実行できて、ゲーム中のメモリ消費についてがテキスト形式でみれる。
そんな優れた機能です。

 

何がわかるのか?

出てくる情報は大雑把にまとめると以下の通りです。
これだけの情報がコマンド1つで分かってしまいます!!

  1. OSでつかってるメモリ
  2. オブジェクトの一覧
  3. RHI (Render Hardware Interface)の消費メモリ
  4. レベル一覧
  5. 動的にスポーンさせたアクタの一覧
  6. コンフィグのキャッシュの消費メモリ
  7. RenderTargetの一覧
  8. テクスチャの一覧
  9. パーティクルの一覧
  10. サウンドの一覧
  11. スケルタルメッシュの一覧
  12. スタティックメッシュの一覧
  13. スタティックメッシュコンポーネントの一覧

 

使い方

コンソールコマンドで「MemReport」を実行するだけです!
すると「プロジェクトフォルダ\Saved\Profiling\MemReports」の中に「〇〇.memreport」が生成されるので、メモ帳やサクラエディタで開きましょう。
「MemReport」だけだと少し簡易的な情報出力で、上の1~5までの情報までしか出ません。
「MemReport -full」を実行することで、1~13までの情報を出力できます。大は小を兼ねるので基本的にはこれを使います。
「MemReport -log」とすることで、ファイルに出力をせずにOutputLogに情報が出力されるようになります。変更を加えた直後に特定のアセットだけ確認したいときに使えます。

MemReportを使う際の注意点ですが、エディタ上でのPIEではキャッシュが残って正確な情報が取れません!
Standalone Gameで実行するか、Developmentパッケージを作成してそれを実行してください。

用途

主な使い道としては次のようなものが挙げられます

・オブジェクトがたくさんあるレベルで、無駄にメモリを消費しているオブジェクトがないかを調べる。
・レベルを行ったり来たりした後に想定以上に個数が増えているオブジェクト(解放されていないオブジェクト)を見つける

特に後者としての使い方は強力で、「最初にタイトル画面でMemrepot→普通にゲーム進行しつつ合間合間にMemReport→最後にタイトルに戻ってきてMemReport」のようにMemReportファイルをいくつか生成します。
最初のタイトルと最後のタイトルで録ったMemReportファイルを差分ツールなどで比較し、増えているオブジェクト、増えているテクスチャなどを調べます。そこで見つかったものがうまく破棄されていないものなので、
そのオブジェクトもしくはテクスチャを頼りにReference Viewerなどで原因を特定していくことができます。

 

最後に

専用のツールや環境を用意する必要なく、コマンド1つで様々な情報がとれるMemReportでした。
オブジェクトの一覧はObj Listコマンド、テクスチャの一覧はListTexturesコマンドでとれるものと同じですが、
自動でファイル出力をしてくれて、1度に多くの情報をとれる素晴らしい機能なので、ぜひご活用してください!!