パフォーマンス、プロファイリング、最適化
概要
動作が良くかつメモリ制限内に収まるゲームを作成することは、多くのシステムと技術に関係する、エキサイティングな問題です。このページは、その問題をクリアするのに役立つ多数のツールとテクニックのための入門的な役割を果たします。世界一優秀なツールを使用していたとしても、最小のデータ / CPU サイクルを使用して望みのものを作成すべきであるという考え方に立つべきでしょう。このページにリストされているツールによって、そのとおりのことができるようになります。
そのため、大きな問題を多数の下位の問題に落とし込むことによって、できる限り正面から各分野に取り組むことができるようにします。これによって、複数の人たちが独立して作業 / 評価することができるようになります。
一般的な維持
ゲームを継続させるには、常に新たな機能を追加し、同時に、予算に合わせるというバランスが必要となります。複数の開発者が手がけているコードがすべて整合しなければなりません。しかも、コードは一方で改変されているのです。ゲームはターゲット プラットフォームの制約内で動作する必要があります。これらの諸要素に配慮しつつ、ゲームの機能性と動作を維持するには、絶えざるモニタリングが必要となります。
ゲームの保守 のページでは、制作中にゲームを維持するために日頃から使用することができるツールとテクニックについて概説しています。
ゲームプレイプログラマーのためのゲームプレイ最適化 ページで、ゲームプレイを最適化するワークフローのサンプルや、 Infinity Blade Dungeons 開発の際に使用されたレンダリング手法の詳細がご覧いただけます。
基本的なツールとテクニック
ゲームのどの部分が問題を起こしているかを簡単迅速に発見できることが、ゲーム制作では非常に重要となります。これによって時間と経費が節約できます。しかし、さらに時間を節約することができます。それには、潜在的に問題となる部分を早期に特定します。通常のゲームテストにおいて問題が発覚するよりも前に特定するのです。ある部分が問題を引き起こしそうだと分かっているならば、他の要素やシステムの多数がそれに依存するようになってより大きな問題となる前に、問題を修正あるいは回避することができます。
基本的なプロファイリングと最適化のテクニック のページでは、現在パフォーマンス上の問題になっているか、これからなりそうな部分または要素を特定および修正するために使用する簡単なテクニックについて説明しています。
メモリ プロファイリング
メモリ使用はゲームにおいて常に気になる問題です。このことは、メモリ領域が限られているコンソールデバイスやモバイルデバイス用のゲームに特に当てはまります。これに該当する問題には、ディスク上のコンテンツ アセットによって占められる領域の量、ランタイム時におけるさまざまなシステムのメモリ使用、メモリ割り当てと解放の量などがあります。これらの情報はすべて極めて重要なものであり、これによってメモリ使用を許容範囲に制限することが可能になります。
メモリの使用とプロファイリング のページでは、ゲームによるモメリの使用を認識および管理するために使用できるツールとテクニックについて説明しています。
コンテンツのプロファイリングと最適化
最近のゲームにおけるコンテンツの量を考えてみると、可能な場合は必ず、ゲームのパフォーマンスに対するコンテンツの影響を制限することが極めて重要となります。コンテンツを最適化することによって最も大きな見返りを得られる可能性があります。そのため、最初にプロファイリングして最適化する分野となることが多いのです。
「Unreal Engine 3」は、このプロセスを実行するのに役立つツールをいくつか提供しています。これらツール、および、コンテンツによる影響を制限する方法については、 コンテンツのプロファイリングと最適化 のページで詳細な説明がなされています。
CPU パフォーマンス
CPU 上でエンジンによって実行される仕事は、スレッドに分解されます。常時複数のワーカースレッドがさまざまな仕事を実行していますが、その中でもメインとなるスレッドが 2 つあります。
- GameThread (ゲームスレッド) - GameThread はゲームプレイの更新を処理します。これには、アクタのティック、コンポーネントのティック、ガベージコレクションの実行などが含まれます。
- RenderThread (レンダリングスレッド) - RenderThread は、光源処理の計算、シャドウイングの計算、透過性のセットアップ、シーンキャプチャの更新、オクルージョンなどを処理します。
CPU 上のエンジンパフォーマンスを管理するということは、あるスレッドが仕事を完了するまで他のスレッドが長く待たされ何も仕事をしない状態に決して陥らないようにすることです。また、CPU 上で仕事をするために費やされる全体的な時間を最小限に抑えるということでもあります。
CPU のパフォーマンス上の問題としてフレームのボトルネックを切り分けたら、次の段階として、C++ のコードにおいて時間がかかる部分を特定するのがよいでしょう。さらに、ロードヒットストアやキャッシュミスといった隠れたパフォーマンス負荷を探す必要があります。
たいていのプラットフォームでは、堅牢な CPU サンプリングツールが利用できます。このツールは、ライブのセッションからキャプチャされたデータを使用して、詳細なコードメトリックスだけではなく C++ コードのためのコールグラフも提供することが可能です。たとえば、Windows プラットフォームにおいては、 Intel VTune を使用して、短時間でサンプリングデータをキャプチャすることによって、ホットスポットを切り分けることができます。コンソールのプラットフォームでも同様なツールを使用することができます。開発ツールチェーンといっしょに備わっていることが多いです。
これらのアプリケーションに精通し、開発の全期間を通じて広い分野で利用できるようにすべきです。
なお、複数のコンソールについては、シングルフレームの CPU サンプリング キャプチャを容易にするユーティリティ関数が「Unreal」に備わっています。 TRACE GAME
とタイプすることによって、CPU の調査を開始します。
たいていの CPU プロファイラーは、サンプリングデータまたはコールグラフデータ (またはその両方) を短時間でキャプチャリングできます。この機能は、持続的で劣悪なフレームレートを含むパフォーマンス上の諸問題をデバッグするのに大いに役立ちます。 サンプリングキャプチャ によって C++ のコードにおける関数コールのホットスポットがたいていの場合得られます。これは時として役立ちますが、 Call Graph capture (コールグラフ キャプチャ) の方がずっと有益である場合が多いのです!
Call graphs はしばしばキャプチャ時間のオーバーヘッドが増えますが、ホットスポットの関数の 呼び出しもと に関する詳細な情報を提供してくれるため、問題源が即座に分かることが多いのです。多数のオブジェクト / アクタ が 1 つの関数を呼び出すことによって速度が低下している場合であっても、コールグラフによって、原因となっているかもしれない特定のアクタ クラス名ないしは他のパターンに運良く行き着くことがあります。
時として、コールグラフによって時間がかかっている UnrealScript が単に示されることがあります ( ProcessEvent や CallFunction へのコール)。そのような場合は、 統計ビューア または ゲームプレイ プロファイラー のセッション キャプチャを起動して、それらのコールまでドリルダウンしていきます。
フレームの 処理落ち を扱う場合は、比較的低いサンプリング頻度のせいで CPU プロファイラーがうまく機能しないことがあります。 この処理落ちがゲームにおいて簡単に再現することができる場合は、短い CPU プロファイリングセッションをキャプチャしながら、可能な限りの頻度で (できればフレーム単位で多数の回数) 処理落ちを起こしてみるのが得策です。処理落ちが捉えがたい場合は、 統計ビューア で使用するためのキャプチャデータを用いて、多数のフレームにまたがる経時的なコールグラフデータを入手します。
GameThread (ゲームスレッド) のパフォーマンス
シーンに加えられるあらゆるゲームプレイ オブジェクトは、リソースを占有します。通常は、最も人目を引くオブジェクトがリソースを最も多く占有します。それらのオブジェクトのために充分なゲームスレッド CPU を確保するには、他のオブジェクトによってリソースが不適切に利用されないようにするとともに、あらゆるオブジェクトが目標を達成するのに必要最小限の動作をするようにします。
GameThread の仕事をプロファイルおよび最適化するために使用される多くのツール、要領、テクニックは、 GameThread のプロファイリングと最適化 のページでその詳細が解説されています。
RenderThread (レンダリングスレッド) のパフォーマンス
光源処理、および、シャドウイング、さらには、プロセッサに高負荷がかかる他の視覚的な要素といったシーンの複雑さは、RenderThread で使用される時間に極めて大きな影響を及ぼします。RenderThread の速度を低下させている部分をつきとめることによって、それほど重要ではない要素の影響度を低下させることに注力できるようになるとともに、不可欠な機能と視覚的表示物にリソースをより多く回すことができるようになります。
RenderThread のプロファイリングと最適化 のページでは、RenderThread で扱われる視覚的な要素をプロファイリングおよび最適化するためのツールと方法について解説しています。
GPU のパフォーマンス
CPU が計算を処理し、フレームごとにゲームを更新する一方、GPU はゲームのレンダリングを担います。これによって、当然のことながら、ポリゴンが描画されることになりますが、それだけではなく、シェーダーの複雑度とオーバードロー、および、GPU スキン化骨格メッシュ、ポストプロセス エフェクト、流体サーファスなどの処理も含まれることになります。GPU が多大な時間を費やして動作する場合は、ゲームがフィルに縛られているか、他のレンダリング要素がパフォーマンス上の問題を引き起こしていることになります。
GPU はレンダリング スレッドからコマンドを受け取ると以下を実行します。
- 頂点の変形と骨格メッシュのスキニング
- ラスタライゼーション (どのピクセルがどのトライアングルに当たるかを判断する)
- シェーディング (所定のトライアングルに含まれるすべてのピクセル上でピクセルシェーダーを実行する。ピクセルシェーダーは、トライアングルに与えられているマテリアルによって制御される)。
GPU のプロファイリングの特性は複雑で多岐にわたります。GPU のパフォーマンスに関するおよその指針を述べれば、常に実験せよということになります。GPU によって実行される操作のうちで最も時間が必要となるのは、ピクセルシェーディングです。GPU をプロファイルする際に考慮すべき重要なファクターには、以下のものがあります。すなわち、使用されているシェーダーの複雑度、シェーダーによって占有されるスクリーンスペースの量、透過性シェーダーによって生じるオーバードローの量など。GPU が担うものには、他にも、スキニングされたメッシュの変形があります。使用されている骨格メッシュにおける頂点の数は、大きなファクターとなります。スキニングされた頂点は、静的メッシュの頂点に比較してかなりコストが高いからです。当然のことながら、描画されるポリゴンの量も GPU のパフォーマンスにとって潜在的に問題となる部分です。(ただし、現代のカードには大量のポリゴンを描画する能力が備わっています)。ただし、望ましい視覚効果を得るには、描画の必要がないポリゴンは描画されないように常に気をつけるべきです。また、メッシュに含まれるポリゴンの数は必要な分だけであるように配慮すべきです。
GPU に関する情報をキャプチャする際の便宜を図るために、コンソール上で GPU 単一フレーム サンプリング キャプチャを実行することができます。それには、 TRACE RENDER
コマンドを使用します。
PC および各種コンソール上で GPU をプロファイルする際に便利なツールがいくつかあります。 GPU のパフォーマンスとプロファイリング のページでは、GPU 上で発生しているパフォーマンス問題の場所を特定するために用いる、「Unreal Engine 3」備え付けのツールと他外部ツールの使用方法について解説しています。
ネットワークのプロファイリング
オンラインゲームにおいては、ネットワークを通じて通信されるデータ量を監視することが重要となります。不必要なデータを大量に送ったり、特定のオブジェクトによってネットワークをスパムしたりしてはいけません。ネットワーク トラフィックの効率性を保つことによって、すべてのプレイヤーにとって (特に、ネットワーク回線容量が限られているプレイヤーにとって) オンラインゲームがスムーズなものになります。
モバイル プロファイリング
モバイルデバイス上のゲームのプロファイリングは、PC でのプロファイリングとかなり似ています。ただし、各種プラットフォーム用の特別なツールや考慮しなければならない事項がいくつかあります。モバイルデバイスのためのプロファイリングの詳細については、 モバイルデバイスのためのプロファイリング のページを参照してください。
Important!
You are viewing documentation for the Unreal Development Kit (UDK).
If you are looking for the Unreal Engine 4 documentation, please visit the Unreal Engine 4 Documentation site.