memreport ばかり見ていると人の心を失って死ぬぞ
Unreal Engine (UE) Advent Calendar 2025 その2 三日目の記事です。
はじめに
こんにちは。普段は福岡のゲーム会社でテクニカルアーティストとして働いています。最近は趣味で20年前のRenderware時代の3Dモデルを現代のFBXの仕様に沿った形でバイナリから復元する作業を行いながら、当時のデータを通して見える先人の知恵や最適化の努力、たった数バイトさえ無駄にしないぞ!といった執念のようなものに感銘を受けています。
現代はハードウェアの性能が進化してデータサイズやメモリ使用量について当時より恵まれた環境にあると思いますがそれ故に甘えてしまっていたりゲームに求められるクオリティや物量も跳ね上がっているのでメモリとはいつの時代も悩みの種になるものなのだろうと感じます・・・
そんなわけで今回はタイトルにもあるmemreportについて書いていきます。
memreportとは
UEのプロジェクトでメモリ使用量の調査などを行う場合はMemory Insightsなどを使ってプロファイリングすることになると思いまが、"memreport"というコンソールコマンド経由で出力できるダンプファイルも初手で雑に調べたい場合は便利です。
Memory Insightsの使い方は公式含めたくさん記事が上がっているので他の記事にまかせるとして今回の記事は"memreport"に焦点をあてて拙作の解析ツールの紹介などを行いたいと思います。
まず、memreport は複数のコンソールコマンドのログを集約したレポートです。ゲームプレイ中にコンソールコマンド「memreport -full」で出力できます(-logというオプションもあります)。ファイルは Saved/Profiling 以下のフォルダに出力されます。拡張子はmemreportですが中身は普通のテキストファイルです。
UE5.6のMemReportFullCommandsの例
どういうコマンドが含まれるかはBaseEngine.iniの[MemReportFullCommands]セクションに以下のようなコマンドが定義してあります。1つ1つのコマンドはもちろん単独でも機能するのでこれだけ知りたい!など目的がある場合はそのコマンドだけ実行するのも有効です。
Mem FromReport
LogCountedInstances
obj list -resourcesizesort
rhi.DumpMemory
rhi.DumpResourceMemory
rhi.dumpresourcememory summary name=Lumen
rhi.dumpresourcememory summary name=Nanite
rhi.dumpresourcememory summary name=Shadow
rhi.dumpresourcememory summary name=DistanceFields
rhi.dumpresourcememory summary name=GPUScene
rhi.dumpresourcememory summary name=SkinCache
rhi.dumpresourcememory summary name=TangentsRHIBuffer
rhi.dumpresourcememory summary name=IndexBuffer
rhi.dumpresourcememory summary name=VertexBuffer
rhi.dumpresourcememory summary name=TexCoordRHIBuffer
rhi.dumpresourcememory summary name=None
rhi.dumpresourcememory summary Type=TextureCube
rhi.dumpresourcememory summary name=CaptureCube
rhi.dumpresourcememory summary name=MorphDeltasVB
rhi.dumpresourcememory summary name=VertexIndicesVB
rhi.dumpresourcememory summary name=VirtualTexture
rhi.dumpresourcememory summary name=VirtualPhysicalTexture
rhi.dumpresourcememory summary name=VolumetricFog
rhi.dumpresourcememory summary name=Hair
rhi.dumpresourcememory summary name=Subsurface
obj list class=SkeletalMesh -resourcesizesort
obj list class=StaticMesh -resourcesizesort
listtextures nonvt
listtextures uncompressed
LogOutStatLevels
ListSpawnedActors
wp.DumpDataLayers
wp.DumpStreamingSources
DumpParticleMem
ConfigMem
r.DumpRenderTargetPoolMemory
ListTextures
ListParticleSystems -alphasort
obj list class=SoundWave -alphasort
obj list class=SkeletalMesh -alphasort
obj list class=StaticMesh -alphasort
obj list class=Level -alphasort
obj list class=StaticMeshComponent -alphasort特にクラス別にロードされているオブジェクトのリストを出力できるobj listなどはメモリ使用量解析以外の用途でも便利なので知っておいて損はありません。
ログのフォーマットについて
memreport を見たことがある人はわかると思いますがフォーマットにかなり癖があり目視での解析が難しい上にエンジンのバージョンによってガラッと仕様が変わることがあるのでmemreport 関連のツールもなかなか保守されないという問題がありました。
フォーマットに興味がある方は以下のサンプルのmemreportをご覧ください。
これでも実はUE5.1あたりからは多少見やすくなっていてコマンドの開始と終了のマーカーが導入されるなど地味に改善もされています。しかし、UE6が出たらまた別物になるのでしょう。
Memreport Insights の紹介
ここからはmemreportが見づらい問題を解決するために作ったMemreport Insightsというツールを紹介します。
特長はざっくり以下のような感じ。
・複数のエンジンバージョンに対応するのが比較的簡単
・機密漏洩に配慮してオープンソース&ローカルで実行可能
・フィルター&ソート可能
・CSVでエクスポート可能
・1つのHTMLファイルで解析結果を共有可能
百聞は一見にしかずということでデモサイトを用意しています。
デモサイトの使い方

"Try with Sample"ボタンを押すとUE5.6のサンプルプロジェクトで取得したmemreportを使った解析結果を表示することができます。
バージョン対応状況

使える = 4.27 / 5.1 / 5.2 / 5.3 / 5.5 / 5.6
少し使える = 5.4
使えない = 5.0
バージョン対応状況は現状このようになっています。使えるバージョンでもすべてのコマンドには対応できていないので一部表形式で表示されないものがあると思います。
githubのissue等でmemreportと一緒に報告していただければ対応しますのでご協力いただけると助かります🙏
記事公開までに5.7対応をやりたかったのですが触る暇がありませんでした。年内には対応しようと思うので対応でき次第Xやこのnoteで告知します。
機能紹介
ここからはツールの機能について簡単に説明していきます。
コマンド別目次

ページ左上のハンバーガーメニューのアイコンから各コマンドの目次を見ることができます。目次の項目数も多いので目次内の検索もできるようにしています。
フィルター(検索)

ボード内の項目すべてをインクリメンタルサーチできます。
ソート(並び替え)

列ごとに並び替えができるのでサイズが大きいもの、小さいものがひと目でわかります。
ダークテーマ対応

ページ右上の三日月アイコンからダークテーマに切り替えることができます。解析作業は目が疲れるので目を労ってください。
HTMLダウンロード

全体をまとめて、または各テーブルごとにCSV/HTMLダウンロードできるようにしています。開発が進むとmemreportも肥大化していくので部分的に切り出すことで共有しやすくなるかと思います。
HTMLの場合は1ファイルにスタイルやフィルター・ソート機能も埋め込まれています。
ローカルで実行する方法
Node.jsをインストールして以下のコマンドを実行するだけです。シンプル!
npx memreport-insightsゲーム開発は機密性が高いので、変なトラブルを回避できるように仕事で使う場合はローカルで実行するのをおすすめしておきます。
※ちなみにデモサイトにmemreportをアップロードしてもサーバー側で保存したりはしていません。ソースコードも公開していませんのでご安心を。
おわりに
今後のnoteの運用については何も考えてないのですがとりあえず5.7対応したらその告知はしようと思います。UnrealEngineの記事を書くかもしれないし、趣味に走って下手なお絵かき帳になってるかもしれないし、Renderwareのdffやanmのバイナリレイアウトとfbxにどう翻訳するかの解説記事を書いてるかもしれません。
memreportの各コマンドのログについても深堀りもそのうち出来たらと思いますがひとまず今回はツールの紹介をメインとさせていただきました。
それでは今年もあと少しですね。お疲れ様でした。
最適化を頑張っている皆さんにお正月がありますように!
参考リンク
記事内で触れたMemory Insightsについても知りたいという方のために参考記事のリンクを記載しておきます。
・"Unreal Engine の Memory Insights | Unreal Engine 5.7 ドキュメンテーション | Epic Developer Community" https://dev.epicgames.com/documentation/ja-jp/unreal-engine/memory-insights-in-unreal-engine
・"[UE4] Memory Insightsを使用したメモリトラッキング" https://qiita.com/EGJ-Ken_Kuwano/items/83425f450f6da100a9d0
・"[UE5]UnrealInsights を使ってみよう!(改訂版)" https://historia.co.jp/archives/48769/
