UDN
Search public documentation:

ProfilingBasicsJP
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

UE3 ホーム > パフォーマンス、プロファイリング、最適化 > 基本的なプロファイリングと最適化のテクニック

基本的なプロファイリングと最適化のテクニック

概要


以下のセクションでは、パフォーマンス問題およびボトルネック、処理落ちのために非常に便利なツールについて解説します。

大概、最初にやるべきことは、フレームが CPU または GPU によって制限されているか否かを判断するとともに、適切なツールを使用して、問題を絞り込んでいくことです。

CPU の動作が緩慢である場合は、これに対処できるコマンドおよびデバッギングツールが多数用意されています。時として、単にアクタと他「動く部分」の過剰な数が原因になって、フレームが遅くなっている場合があります。また、意図した動きをしない AI クラスがフレームごとに数千の光線キャストをアクティベートしている場合もあります。忍耐力を持ってすれば、これらのパフォーマンス上の問題を追跡することによって個別レベルのアクタまでたどっていくことができます!

GPU パフォーマンスについては、PIX を使用して、描画イベントやシェーダーパフォーマンス、インゲームのビジュアル化モードおよび HUD 統計情報を分析しなければならないことがあります。これらの問題をたどっていくと、コンテンツのレイアウトか、あるいは光源のプロパティに行き着く可能性があります。

いずれのケースでも、持続的なフレームレートの問題または処理落ち (フレームタイムの激増) に対処することになるでしょう。持続する低いフレームレートについては、単一フレーム キャプチャ ツール (TRACE コマンドなど) とサンプリング プロファイラー (VTune など) が有効です。処理落ちについては、StatsViewer ツールを使用することによって、コールグラフを使った経時的なフレーム分析を行う必要があるでしょう。

なお、「Unreal」のツールの多くは複数のプラットフォームで動作しますが、コンソールのパフォーマンス デバッギング ツールは PC のものと異なっているのが普通です。

STAT コマンド


デバッグやテスト、ゲームのプロファイルを行う際、意味あるデータをゲーム内で直接素早く調べ評価できることが必須となります。STAT コンソールコマンドの使用を通じて、「Unreal Engine 3」は、ゲームおよびエンジンのさまざまな点に関して、任意の数の統計を表示する機能を提供しています。この統計データは、HUD としてスクリーンにレンダリングされます。

Stat コマンド解説 のページには、利用可能な全 stat (統計) コマンドの完全なリスト、および、各コマンドによって示される各種メトリックスに関する解説が掲載されています。

プロファイリング環境の準備


  1. まず、ゲームが稼働しているときに STAT UNIT を起動します。
  2. あらゆる長いスパムを無効にする か、パフォーマンス結果を阻害するであろうコードをデバッグします。
  3. 処理落ちの原因になるため、 ガベージコレクション検証 を無効にします。
  4. VSync を無効に して、ボトルネックを特定します。これは高速のフレームでも行います。

STAT UNIT

STAT UNIT コマンドを使用することによって、フレームタイムのボトルネックの場所を特定します。 STAT UNIT によって、オンスクリーンの HUD が切り替えられます。この HUD は、フレームタイム、ゲームスレッドタイム、レンダリングスレッド (描画) タイム、GPU タイムを (可能であるならば) 表示するためのものです。 STAT UNIT は、パフォーマンス問題を追跡する際に、非常に重要な第 1 ステップです。ほぼ常時有効にしておくべきです。

また、 STAT FPS コマンドを使用することによって、スクリーン上にフレームレートとフレームタイムを表示できます。

ガベージコレクション検証を無効にする

パフォーマンスに対処する際は、常に _GC (ガベージコレクション) 検証を無効にします。そうでないと、少なくとも約 30 秒ごとに Release ビルドで大量の処理落ちが発生することになります。以下の方法のうちどちらかを利用することができます。

Final Release モードでスクリプトをコンパイルする

UnrealScript のパフォーマンスは、ロギングとアサーションが有効になっている場合、大きく異なる可能性があります。出荷タイトルに極めて近似したパフォーマンスを得るには、 Final Release モードでスクリプトをコンパイルするのが簡単です。これによって、高価なコールを、コンパイルされるバイトコードから自動的に除去することができます。 Final Release スクリプトをビルドするには、以下のいずれかの方法を利用します。

  • Unreal Frontend において、 [*Cooking*] タブを選択し、 [*Cook Final Release Scripts*] のチェックボックスを有効にする。これによって、クッカを実行するか UFE を通じてゲームを起動すると、 Final Release スクリプトがコンパイルされて使用されることになります。
  • -Final_Release コマンドライン 引数を make コマンドレットに渡す。

VSync を無効にする

最善の結果を得るには、 VSync を無効にしなければならない場合があります。 (VSync は、フレームを表示する前に vertical retrace (垂直復帰) を待ちます)。そうしなければ、フレームタイムがゲームのリフレッシュレートにパディングされ、正確なピクチャーを得ることが一層難しくなります。 VSync を無効にするには、次のいずれかの方法をとります。

  • -NoVSync コマンドライン オプションをゲームに渡す。
  • Unreal Frontend の [*Game*] タブで、[*No VSync*] (VSync なし) のチェックボックスを有効にする。

STAT SLOW を使用する

STAT SLOW コマンドを使用することによって、パフォーマンスの突出部分を検出することができます。これによって、処理落ちを絞り込むことができるようになります。それには、フレームにおける特定の時間 (デフォルトでは 10ms) よりも長いあらゆるサイクル統計情報をレポートします。 統計値がゆっくりと実行されるため、しばらくの間 HUD で表示され、スクリーン上でゲームの動作と突出部分を容易に関連づけることができるようになります。

これを使用するには、閾値を秒 (10 秒は 0.01 になる) で表したもの、および、突出した統計値をレンダリングする期間を指定するオプション引数とともに STAT SLOW をコンソールに入力します。デフォルトでは 10 秒になっています。

*例 : * STAT SLOW 0.01 10

これによって、最後の 10 秒で 10 ms以上のあらゆるサイクル統計値がレンダリングされます。

ヒントとこつ


以下のセクションでは、パフォーマンス問題をプロファイリングする際に重要となるヒントとこつについて取り上げます。

機能を無効にする

ゲームにはすばらしい機能が数多くありますが、通常、コストがやや高くなります。通常はそれでも構わないのですが、こうした負荷の大きい機能を数多く開始したときや、複雑なシーンにおいて、これらの機能のためにシーンのスピードが遅くなってしまうようだと事態は異なります。何時間もかけて最適化を行い、20-40% の改善を達成しても、シーンのスピードアップには十分ではないかもしれません。これに代わる方法は、その機能を単に無効にすることです! 大量の殺りくが行われているために気づかれないかもしれないことや、はるか遠くにあるものなどについては、この方法が非常に効果的です。

また、「不必要な機能を無効にする」ことは、プロファイリング実行にも役立つテクニックです。あるものの最適化に時間を費やす価値があるかどうかを把握することも、時に必要です。「今この機能を無効にしたら、フレームタイムの予算はどうなるだろうか」と考えているのであれば、いっそその機能を完全に無効にしてみるのが良いのです。

使用例

  • プレーヤーからはるか遠くにいる敵については、地面に少量の血のデカールを発生させる必要がないことがよくあります(例、狙撃された血のエフェクト)。
  • プレーヤーが絶対に近寄れないことを LD がわかっている敵(例、到達不可能な崖の上にいる敵)は、血まみれになったり武器を落としたりする必要はありません。
  • 複雑な SkeletalControl を最適化する代わりに、オーナーが見えない時には更新しないことです。
  • 布地がシーンではない場合、シミュレートすべきではありません!

ウォールを調べる

見えないときに更新される必要のないものをコードが更新しているケースが非常に多くあります。あるレベルに行ってウォールのほうを向き、通常のプロファイリングの全てを実行すると、オブジェクトが間違って、必要のないときに、自動的に更新しているかどうかがよくわかります。

もちろん、見えないときでも自動的に更新する必要のあるものもあります。しかし、オブジェクトの多くは常に更新していなくても何とかなるものです。

同一タイプを任意の数スポーンする

多数の同じタイプの敵が攻撃してくると、ゲームが遅くなることがよくあります。その敵のタイプの何かが遅いのです。問題は、残りのエンジンが邪魔をしているために、何が遅れているのかがわかりにくいことです。この問題を回避するには、テストレベルを取得し、これらの敵を任意の数だけそこにスポーンさせてプロファイリングします。これによって、問題のある場所が簡単にわかります。

以上は、簡単に使えるテクニックです。それには次のようにします。

  • 問題のありそうな複数のオブジェクトをテストレベルに置きます
  • プロファイリング実行!