UDN
Search public documentation:

HotSpotReportGenerationJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UDK レベル作成ホーム > ホットスポット レポートの作成

ホットスポット レポートの作成


概要


以下の記事では、レベルデザイナーを対象にしたホットスポット レポートの作成方法について説明します。これらのレポートは QA 部署によって作成されるもので、サブレベルのストリームイン / アウトによるメモリディップ (メモリが落ち込んだ状態) を識別するのに役立ちます。これによって、レベルデザイナーは、最も負荷がかかるバケットを見つけやすくなり、メモリに適合するようにレベルを最適化することができるようになります。

生の MemLeakCheck (メモリ リーク チェック) データを作成する


SP レベルのメモリステータスをプロットするのに使用する生のデータを得るには、次の作業が必要になります。

  1. UnrealConsole をロードし、この検証に使用されるゲームのインスタンスに接続します。
  2. キャプチャ元にするビルドにある DebugConsole 実行ファイルを起動します。
  3. キャプチャの対象となる SP レベルの中に入ります。
  4. レベルに入ったら、次のコマンドを使用します。
    DoMemLeakchecking 30

    1. という数字は、memleakcheck のキャプチャ間の秒数です。必要に応じてこの頻度を増減させることが可能です。ただし、通常はこの値を一定に保つことによって、経時的に適切にトレンドを追跡するべきです。
  5. P レベルがこれから変化するときに、 stat levels (統計 レベル) を有効にして追跡を可能にします。
  6. P レベル全体を通過し、次の P レベルに移行します。
  7. 移行した P レベルへのキャプチャが 2 つ終了したら、メインメニューに戻るか、再ブートします (あるいはその両方を行います)。
  8. 他のレベルのキャプチャに入る前には、必ず再ブートしなければなりません。
  9. プロファイルされているプラットフォームに応じて、memleakcheck ファイルが以下のフォルダに作成されます。
    • PC/UDK の場合 :
      [install]\[GameName]\Profiling\MEMLEAKS
    • iOS の場合 (PC に直接ドキュメントをバックアップした後に。ドキュメントディレクトリのバックアップについては デプロイ ツール をご覧ください。):
      [install]\[GameName]\iOS_Backups\[DeviceName]\Profiling\MemLeaks
  10. 各 memleakfile は、キャプチャが開始されたレベルに基づいて名づけられたフォルダの中に解析されます。
    たとえば、 レベル a でキャプチャが開始され、 レベル b および レベル c に進んだ場合、これら一連の結果は レベル a フォルダに置かれます。
  11. これらの memleakcheck ファイル / フォルダを、探しやすい場所にコピーします。

データを取り出す CSV ファイルを作成して


  1. 次のフォルダから memleakcheckdiffer.exe を起動します。
    ..\Binaries\
  2. MemLeakCheckDiffer において、 File > Open を選択して、フォルダとサブフォルダにある、すべての Memleak ファイルを開きます。
  3. 検索して、memleakcheck ファイルを置いたフォルダに進みます。
  4. フォルダで MemLeakCheckDiffer が立ち上がるまで待ちます。
  5. すべてのフォルダで MemLeakCheckDiffer ウインドウが立ち上がったら、 Generate Overall Report (全体レポートを作成) を選択します。
  6. 各レベル用 CSV ファイルが作成されます。また、GlobalSummary (全体的要旨) CSV ファイルも作成されます。
  7. CSV ファイルが置かれる場所は、MemLeakCheck ファイルが置かれたフォルダです。

全体的なトレンドデータについて解析する


  1. Excel で GlobalSummary スプレッドシートを開きます。
  2. コンテンツデータをより見やすくするために、次の行以外は非表示にします。
    • LowestTFP
    • AnimSequenceClasses
    • SkeletalMesh_Classes
    • SoundNodeWave
    • StaticMesh_Classes
  3. バケット名で始まり行の最後の値で終わる これら 5 つの行をハイライト表示します。
  4. それらが選択されたら、 Insert (挿入) > Line Graph (線グラフ) を選択します。
  5. これによって、各コンテンツ バケットの状態とレベルの全体的なメモリトレンドを素早く把握することができます。

各レベルの CSV ファイルを解析する


ディップの場所を把握した後は、このメモリの変化を起こす原因となったコンテンツ バケットがどれなのか特定する必要があります。このためには、特定のディップから最も低いメモリの値を探し、そのディップからバケットの値を取り、そこからディップ開始前のバケットの値を引きます。これによって、どのバケットがこの位置において最も大きな問題であるかが簡単に分かるようになります。

たとえば、レベルにおいて AnimSequence クラスのデータがディップ発生前に 10 MB あり、ディップを開始すると、このバケットにおいて 25 MB まで上昇した場合、大量のアニメーションデータを必要とする何かがここでロードされ、そのせいでレベルのメモリが低下したのだと、レベルデザイナーや他の開発者は気がつくことでしょう。

このデータはできる限り各ディップと共に含まれているべきです。ディップが生じたときに、ロードされていたサブレベルに伴ってコンテンツバケットがどの程度変化したかを知らせるだけで、レベルデザイナーは、何を変更しなければならないのか、また何をレベルから削らなければならないのかが分かるようになります。

「人にやさしい」ホットスポット レポートをレベルデザイナーに


レベルデザイナーにホットスポット レポートを作成する場合、情報はできるだけ利用しやすい形で提供すべきであるということを忘れないでください。すなわち、レベルデザイナーは、メモリがディップしたときに、何があったのかを知る必要があるのです。そのため、メモリが低下し始めたときに、新たにストリームインしたサブレベルのリストが必ず含まれていなければなりません。

また、bugit (バグ要修正) の箇所を伝えることによって、ディップが発生する前のレベルのエリアをレベルデザイナーが直接見つけることができるようにします。これによって、レベルデザイナーは、エディタまたはインゲームでその箇所の周辺を検討し、そこがどのようになっていて、どこを変更しなければならないのかということが分かるようになります。

以下は、ホットスポットのレポート例です。

この検証期間中において最も低いメモリは 20 MB であり、次のサブレベルがロードされていました。

  • SP_Example_W
  • SP_Example_02_boss
  • SP_Example_02_S
  • SP_Example_03
  • SP_Example_04

下のグラフから分かるように、30 MB の基準を下回っているディップは 2 つあります。

examplegraph.jpg

第 1 のディップ

以下の bugit の箇所によって、このディップが発生する直前のレベルのエリアを見つけることができます。

  BugItGo -1858.2000 -2162.7903 1572.0010 64073 -16686 0=
  

このディップの期間において、Anim Sequence クラスは 15 MB、Skeletal Mesh クラスは 5 MB、 Sound Node Waves は 5 MB、Static Mesh クラスは 2 MB、それぞれ上昇しています。

以下の新たなサブレベル (複数もあり得る) が、この最初のディップが起きた期間である、3 番目と 6 番目のキャプチャの間にストリームインしています。

  • SP_Example _Cine

第 2 のディップ

以下の bugit の箇所によって、第 2 のディップが発生する直前のレベルのエリアを見つけることができます。

  BugItGo 904.3768 261.3029 1761.1804 -4788 -20256 72
  

このディップの期間において、Anim Sequence クラスは 10 MB、Skeletal Mesh クラスは 2.5 MB、 Sound Node Waves は 5 MB、Static Mesh クラスは 1 MB、それぞれ上昇しています。

以下の新たなサブレベルが、この 2 番目のディップが起きた期間である 8 番目と 12 番目のキャプチャの間にストリームインしています。

  • SP_Example_02_boss
  • SP_Example_02_S
  • SP_Example_03

処置すべきアイテム


ディップが発生したときに、単一のバケットにおいて大きな変化がある場合は処置すべきです。多くの場合において、シネマティックスなどによって特定のバケットが大幅に上昇します。これはバグが原因ですが、ベークとプルーン (prune) を有効にするなどの処置を取れば簡単に修正できます。労せずして得ることのできる成果は、できるだけ早くものにしてしまいましょう。

避けるべきアイテム


ホットスポット レポートをコンパイルする際、レベルデザイナーが関与できないバケットを処置するのは避けるべきでしょう。また、有効なデータが得られないバケットの有無についても判断する必要があります。この検証の例では、テクスチャプールの統計値が、メモリを調べるために有効なバケットにはなっていませんでした。これは、キャップのかけられ方が、記録されていたものと異なっていたことによります。

フォローアップ用ホットスポット レポートを作成する


レベルデザイナーは、フォローアップ用レポートによって、最初のメモリレポートを受け取ってからどの程度の改善 / 減退があったかを理解することができるようになります。フォローアップ用レポートを送信することは重要です。メモリが改善した場合に (他のレポートを必要としないぐらい良くなっている場合であっても)、フォローアップ用レポートを送信することによって、加えた変更が正しい影響を及ぼしたということをレベルデザイナーが分かるようになるからです。

究極の目標は、レベルをメモリに収め続けるということです。レベルデザイナーに現在レベルがどのような状況にあるかを把握してもらうことは、この目標を達成するために欠かせない要素となるのです。

長期に及ぶ実行


充分なレベルがメモリに収まった後は、複数のレベルでより長い期間に及ぶメモリ実行を開始するべきです。そのためには、遮るものがない大きく広がったレベルを探し、 domemleakchecking 30 (メモリリークチェック) コマンドを起動して、できる限り広い範囲でプレイします。これらの実行中に reducepoolsize (プールサイズの削減) を使用することによって、最長のものを得ることができます。

このデータを使用して、個々のレベルの実行と継続的な実行の差を取って、この 2 つにおける基本的なメモリの差分を得ることができます。このデータを調べることによって、個々のレベルに処理するのに必要となるオーバーヘッドの量を知ることができるようになると共に、場合によっては発生しているかもしれないメモリ リークの位置を突き止めることができるようになります。

コールドスポット レポート


メモリディップが解決して、ゲームがメモリ制約の制限内にある場合は (同時に、時間が許す場合は)、コールドスポット レポートシステムを実装することが可能です。これがどういうものか説明します。メモリを経時的に観察したときと同じプロセスが取られます。ただし、このコールドスポット レポートの場合は、削減するのではなく追加するスペースをもつエリアに注目します。早い段階で実行することによって、レベルデザイナーは、メモリ制約内でエリアを一層充実させることができるようになります。