Unreal Engine でメモリ使用量を確認する

プロセスのメモリ プレッシャーを表す「匿名 RSS + スワップ」は、ゲームの安定性を維持するための重要な指標です。これは、メモリ リミッター(Android 17 以降)のメモリ上限のしきい値と、Google Play Console のメモリ Vitals の標準ベンチマークの両方として機能します。

Unreal Engine 内で実行時または静的に「匿名 RSS + スワップ」と完全に一致するメモリ使用量を測定することは困難です。

メモリ使用量をトラッキングするために、Unreal Engine は VmRSS + VmSwap 指標を提供します。VmRSS には rssFilerssShmem が含まれているため、「匿名 RSS + スワップ」よりも広範囲ですが、信頼できる推定値として機能します。

ゲームのメモリ使用量を分析する手順は次のとおりです。

C++ API を使用してメモリをクエリする

次の C++ API を使用して、メモリ指標をクエリします。

軽量メモリクエリ

軽量なメモリクエリには GetMemoryUsedFast を使用します。Android では、このメソッドはファイル全体を読み取るのではなく、/proc/self/status から必要なメモリ フィールドのみを解析して、推定フットプリントを返します。

詳細なメモリ統計情報

GetStats を使用して、プラットフォームのメモリの詳細な統計情報をクエリします。このメソッドは、FPlatformMemoryStats.UsedPhysicalFPlatformMemoryStats.RssFile の両方を返す、包括的なプラットフォーム メモリ統計情報を提供します。UsedPhysicalVmRSSVmSwap の合計であるため、RssFile を減算することでベンチマーク値に近づけることができます。

#include "HAL/PlatformMemory.h"

uint64 GetEstimatedPhysicalMemory()
{
  FPlatformMemoryStats Stats = FPlatformMemory::GetStats();

#if PLATFORM_ANDROID
    return Stats.UsedPhysical - Stats.RssFile;
#else
    return Stats.UsedPhysical;
#endif
}

コンソール コマンドを使用してメモリをモニタリングする

このアプローチを使用して、ゲームがデバイスで実行されている間のメモリの傾向をモニタリングします。コンソールを開くには、4 本の指で画面をタップし、次のコマンドを入力します。

コマンド 説明
stat unit Mem 行に現在の物理メモリ使用量の合計が表示され、フレームごとに更新されます。
stat unitmax [Mem] 行に、物理メモリと仮想メモリの平均メモリ使用量とセッションのピーク時のメモリ使用量の合計が表示されます。

Mem 行を表示する Unreal Engine の stat ユニット オーバーレイ。
図 1. Mem 行を表示する stat unit オーバーレイ。

Unreal Insights でメモリを可視化する

Unreal Insights を使用すると、フレーム単位のタイムライン グラフを使用して、プラットフォームのメモリ統計情報やカスタム カウンタなどのメモリ指標をモニタリングし、経時的に可視化できます。

  1. default,counters を含むフラグを使用してデバイスをメモリ トレース チャンネルに接続し、フレーム タイムラインとともに PlatformMemory/UsedPhysicalVmRSS + VmSwap)グラフを表示します。
  2. 省略可: カスタム メモリ指標をより詳細にトラッキングするには、TRACE_DECLARE_MEMORY_COUNTERTRACE_COUNTER_SET を使用してカスタム トレース カウンタを宣言し、更新します。
#include "ProfilingDebugging/CountersTrace.h"

TRACE_DECLARE_MEMORY_COUNTER(Trace_EstimatedPhysicalMemory, TEXT("Memory/EstimatedPhysicalMemory"));

void UpdateMemoryTraceCounter()
{
    // Note: Ensure GetEstimatedPhysicalMemory() is defined as shown
    // in the Query memory at runtime using C++ APIs section.
    TRACE_COUNTER_SET(Trace_EstimatedPhysicalMemory, GetEstimatedPhysicalMemory());
}

Unreal Insights に Memory/EstimatedPhysicalMemory が表示されている。
図 2. カスタム Memory/EstimatedPhysicalMemory カウンタを示す Unreal Insights のタイムライン。

Perfetto を使用して正確なメモリ使用量を確認する

推定値ではなく、Android OS の正確な「匿名 RSS + スワップ」の値を確認するには、Perfetto を使用します。Perfetto は、システムレベルのメモリ指標をキャプチャして、ゲームの正確なフットプリントを評価します。

匿名 RSS、スワップ、それらの合計クエリを示す Perfetto UI。
図 3. 匿名 RSS、スワップ、それらの合計クエリを示す Perfetto UI。