ゲームが GPU 依存ではありませんか?

ゲーム

この記事は、The Parallel Universe Magazine 39 号に掲載されている「Is Your Game GPU-Bound?」の日本語参考訳です。


parallel_v39_03

コンピューター・グラフィックスは、コンピューターでの作業、映画の視聴、スマートフォンの使用、さらには車の運転まで、日常生活において重要な役割を果たしています。グラフィックス・プロセッサーのパフォーマンスは、この 10 年間で劇的に向上しました。そして、その過程におけるビデオゲーム業界の影響は小さくありません。同時に、GPU 機能の継続的な成長は、ゲーム開発者に新たな可能性をもたらし、ハードウェアを最大限に活用する画期的なレンダリング手法やエフェクトの考案を促してきました。しかし、GPU ハードウェア開発者とゲーム開発者のこの競争には課題があります。多くの場合、革新的なレンダリング手法はハードウェアの制限に直面します。

この記事では、高レベルのシステム概要を使用して、ゲームが GPU 依存かどうかを素早く簡単に判断する方法を紹介します。

ゲーム・パフォーマンスの基本

ビデオゲーム制作には多額の費用がかかります。パフォーマンス最適化への投資は、ゲーム・プロジェクトの収益性に影響する重要な工程です。通常、ゲームのジャンル―アクション、アドベンチャー、戦略、その他―によりパフォーマンス要件は異なります。アーティファクトの描画に顕著な停滞や遅延が生じ、ゲームが目に見えて遅い場合は、対処が必要なパフォーマンスの問題が存在します。

ゲームのパフォーマンスを測定するメトリックは、1 秒あたりにレンダリングされるフレーム数 (FPS) を示すフレームレートです。FPS はさまざまなアプリケーションのベンチマークとランク付けに使用され、FPS が高いほうが優れています。ほとんどの場合、このアプローチを使用できます。例えば、FPS が低いと動きが多いアクションゲームは見栄えが良くありません。

最近のゲームは、複数のコンポーネントで構成されており複雑です。

  • グラフィックスのレンダリング
  • 物理特性の計算
  • サウンドの再生
  • スクリプトの実行
  • ネットワークのホスティング
  • その他

各コンポーネントは、個別にまたは連動して、ゲームのパフォーマンスに影響します。そのため、アプリケーションが GPU 依存か CPU 依存かを特定することは容易ではありません。

レンダリングはゲームを構成するコンポーネントの 1 つですが、グラフィックスはゲームの独特な作風、スピリット、雰囲気を作り出す上で重要であるため、レンダリングから解析を開始することは合理的です。

従来のレンダリング・パイプライン

グラフィックス・レンダリング・パイプライン、グラフィックス・プログラミング・モデル、およびこの処理におけるグラフィックス・ドライバーの役割を理解せずに、GPU がパフォーマンス・ボトルネックかどうかを正確に判断することはできません。アプリケーション・コードからハードウェアにまで、スタック全体の GPU アクティビティーを徹底的に解析するには、かなりの専門知識が必要です。幸いにも、基本的なパフォーマンス解析を実行すれば、詳しい調査を行わなくても GPU 全体の利用状況を確認できます。

レンダリング・パイプラインの動作にはリソースと状態が伴います。パイプラインにバインドされたリソースは、何を、どこでレンダリングすべきかを指定します。リソースは、適切な形式で記述されたジオメトリー、テクスチャー、およびレンダリング・ターゲットで構成されます。ラスタライズ・パラメーター、デプス条件のテスト、属性のブレンド、およびその他の状態は、画面上にイメージを生成するためこれらのリソースをどのように解釈して処理するかを指定します。レンダリング・リソースと状態は、シェーダーと呼ばれる GPU プログラムと緊密に連携して、レンダリング・パイプラインのさまざまなステージで実行されます (図 1)。


図 1 レンダリング・パイプライン

従来のレンダリング・パイプラインは、ソースデータを受け取り、各ステージで順次処理します。最終的な結果が得られるまで、これを繰り返します。レンダリングされたオブジェクトは、最初に仮想空間で変換され、次にスクリーンサーフェスに投影されます。その後、投影の可視部分が色付けされ、フレームバッファー内のほかのレンダリング・オブジェクトとマージされます。

グラフィックス・プログラミング・モデルは単純です。レンダリング・コマンドを正しい順序で送信するため、描画コンテキストを構成して開き、使用します。パイプラインにジョブの実行を指示する描画コマンドを呼び出す前に、必要なリソース、状態、およびプログラムをパイプラインにバインドする必要があります。この処理は、最終的なシーンがフレームバッファーに形成されるまで、オブジェクトのレンダリングに必要な回数だけ繰り返されます。最終的なシーンは、バッファー・スワップ・コマンドでスクリーンに出力されます。OpenGL*、DirectX*、Vulkan*、またはその他のグラフィックス API など、アプリケーションが使用する API に関係なく、この概念は同じです。

1 つの描画に多くの複雑な処理が含まれていることは明らかです。描画時間には、各処理にかかった時間が含まれます。個々の描画にかかる時間はさまざまで、合計フレーム・レンダリング時間に影響します。長いフレーム時間は GPU 依存を示す可能性があります。これは、グラフィックス・ドライバーのパフォーマンス・メトリックを基に GPU ロードを予測することで確認できます。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました