ジオメトリがGPUパフォーマンスのボトルネックかを確認するためのいくつかの手順

ゲームは、GPUが処理できるよりも多くのジオメトリをレンダリングしていますか?ここでは、ジオメトリがプレーヤーのGPUでパフォーマンスのボトルネックを引き起こしているかどうかを確認するためのいくつかの手順を示します。

このブログ投稿では、次のことを共有します。

  • ジオメトリの複雑度とは何か、それがプレーヤーにどのように影響するか。

  • ジオメトリの複雑さがゲームのパフォーマンスのボトルネックかどうかを確認する方法

ジオメトリ単純化してゲームのパフォーマンスを向上させる手順

はじめに

私たちの計画に従って、今日のトピックは特定のGPUパフォーマンスの柱についてです

Geometry Complexity の有名なパフォーマンス領域について説明します。

ジオメトリの複雑さがなぜ開発者にとって重要なのですか?

パフォーマンスのボトルネックには、現在のシーンプレーヤーのハードウェア応じて、さまざまなサイズと色があります。

パフォーマンスのボトルネックの正確な原因を見つけるのは開発者の責任です。

そして、ジオメトリの複雑さはこれらの潜在的なボトルネックの1つです。GPUに深刻な影響を与えるものです

この投稿を読み終えると、次の2つの質問に答えられるようになります

  1. ジオメトリによってゲームのボトルネックが発生していますか?

  2. どうすれば修正できますか?

ジオメトリの複雑性とは何ですか?

私たちは皆、ゲームで驚くべきビジュアルを望んでいます。

また、ジオメトリは、スタイルに関係なく、ゲームのすべてのビジュアルの基本的な基盤です。

3Dゲームと2Dゲームのどちらを開発していてもかまいません。すべての頂点と三角形、つまりジオメトリです。

各頂点は(オブジェクト)空間内の点です。そして多くの場合、各頂点には、UV0、UV1、カラーなど、単なる位置よりも多くのデータがあります。

頂点属性が多いほど、より多くのメモリ帯域幅が必要になります。つまり、フレームレートが低くなり、電力消費が増加します。

ジオメトリの複雑さは、基本的にGPUにプッシュする頂点と三角形の量です。これにはアトリビュートが含まれます。では、あまりにも多くのジオメトリをGPUにプッシュするとどうなりますか?

ジオメトリの複雑さの結果

プッシュする頂点が多すぎると、GPUの頂点シェーディングユニットが圧倒されます。

レンダースレッド。そして消費電力に影響します。

プッシュする頂点が多すぎると、ゲームの処理速度が低下します。これは、GPUがデータのシットロード(メモリ帯域幅)を強制的にフェッチするため、処理(算術演算)が必要になるためです。

やり過ぎると、144 fpsが許可するよりも多くの時間が必要になります。

UnityゲームのパフォーマンスはVertex-Boundですか?

例えば、ゲームが20 FPSで実行されていて、あなたは頂点カウントがこれを引き起こしているという直感を持っていますが、あなたはそれを確認したいと思います。

まず、頂点数を大幅に減らして、フレームレートが大幅に増加するかどうかを確認します。

幸いにも、私たちを助けるための素晴らしいツールがあります

ツールに入る前に、これについてお話ししましょう…

理想的なアプローチは、このすべての前に1つの追加ステップを実行することです。

理想的には、最初ゲームの残りの部分単純化して、ボトルネックが実際に頂点ステージから発生していることを確認する必要があります。

つまり、さまざまなステージのコストを一時的に取り除くことです。

  • CPU:AI、物理、ネットワーク、アニメーション、オーディオを無効にします。ドローコールを減らします。

  • GPU:レンダリング解像度を下げ、テクスチャの最大サイズを32に減らし、マテリアルのシェーダーを非照明色に変更します。

他のすべての高価な部品を取り除いても、ゲームがまだ機能しない場合は、複雑さが原因であると確信できます。

そうしないと、ボトルネックが別の場所から発生する可能性があるため、100%確実であるとは言えません。

例を見てみましょう。これは、ジオメトリのボトルネックを示すプロファイラーキャプチャです(必要に応じてズームします)。

頂点カウントのボトルネックを示すプロファイリング

分かりますか?

CPUオーバーヘッドはほとんどありません。

メインスレッドとレンダリングスレッドはアイドル状態で、GPUの終了を待機しています。

だから、理想的には、あなたがしなければならないことは次のとおりです:

  • シンプルなサブシステムと複雑なジオメトリでゲームをプロファイリングします。

  • ジオメトリの複雑さを軽減します。

  • シンプルなサブシステムとシンプルなジオメトリでゲームをプロファイリングします。

  • 両方のバージョンを比較します。

単純なジオメトリでフレームレートが大幅に増加する場合は、勝者がいます。

ジオメトリを単純化する方法は?

SimplygonでUnityの頂点数を減らす方法

従来の方法は、元の3Dモデリングソフトウェアでモデルのジオメトリを簡略化するアーティストを雇うことです。

これは最高のビジュアルを提供する方法ですが、特にボトルネックをテストする場合にも最も費用がかかります。

あなたがインディーデベロッパーである場合、アーティストを見つけるために何が必要か(またはそのための時間)を知っています:お金、涙、血。

時々、good&doneはperfect&lateよりも優れています。

とはいえ、私のお気に入りのツールの1つを紹介しましょう…

公式のGamedev GuruのEssential Tools Listへの最新の追加であるSimplygonを温かく歓迎します

Simplygonがあなたの心を征服する方法はここにあります

  • それは自動的にあなたのメッシュを簡素化します…

  • いくつかの単純なパラメーターに基づいて、そして…

  • これは無料です(ほとんどの場合)。

  • それは簡単です。

  • これは速い。

ハイポリメッシュイン、ローポリメッシュアウト。それと同じくらい簡単です。次に例を示します。

600万頂点から2分未満の約2k頂点。ノーマルマップも作成します。悪くありません。

確かに、単純化されたメッシュがどれほど醜いかを言う言葉はありません。

そしてここに重要なことがあります:Unityのパフォーマンス分析では、かなりのメッシュは必要ありません

頂点の数を大幅に減らしながら、類似した形状のメッシュが必要です。

これは、テスト変数の追加を避けるためにモデルの形状を変更したくないためです。

より単純なメッシュを作成したら、シーン内のメッシュを変更する2つのオプションがあります。

  • あなたは高ポリゴンバージョンを低ポリゴンバージョンで置き換えることができます、または…

  • LODグループ使用して、カメラの距離に応じてグループを切り替えることができます

メッシュのシンプルバージョンに切り替えた後、別のプロファイルを取得しました…

ボトルネックのない単純な形状のプロファイリング

確かに、品質は落ちますが、覚えておいてください。フラグメントシェーダーを法線マップ、視差マッピングなどで複雑にすることで、品質の低下に対処できます。

より上級のユーザーのために、ここにあなたのためのいくつかのアイデアがあります:

  • テッセレーション使用してメモリ帯域幅を減らす

  • 3D Imposter スプライトのレンダリング使用して、長距離で2つの三角形に簡略化します。Amplify Impostorsあなた(アフィリエイトリンク)のためによくそれをしません。

次は何ですか?

  • これで、パフォーマンスのボトルネックがシーンごと、プラットフォームごとに異なることがわかりました。

  • ゲームのボトルネックの正確な原因を見つけることが重要です。

  • 頂点数を減らした後でフレームレートが大幅に増加するかどうかを確認して、ゲームが頂点にバインド(束縛)されているかどうかを確認します。

  • 理想的には、安価な他のサブシステムと比較してください。

  • 手動で、またはSimplygonなどのツールを使用して、頂点数を減らします。

  • LODグループを導入して、より複雑なジオメトリと単純なジオメトリを動的に切り替えることを検討してください。

この投稿は、Unityパフォーマンスピラーシリーズの一部であり、Unityパフォーマンスチェックリストに基づいています。

Unityパフォーマンスチェックリストを今すぐ入手して、ゲームのパフォーマンスを向上させ、厄介な1つ星のレビューを回避してください。

来週は、メモリの最適化に関するいくつかのトリックを紹介します。

したがって、前もってチェックリストのメモリセクションを読んでください。

コメントを残す

メールアドレスが公開されることはありません。

Next Post

NeoAxis Engine 2020.3がリリースされました

金 7月 10 , 2020
NeoAxis会社は、組み込みの3Dおよび2Dゲームエンジンを備えた統合開発環境であるNeoAxis Engineの新バージョンをリリースします。この環境を使用して、コンピューターゲーム、ビジュアルトレーナー、VRシステムなど、あらゆる種類の3Dおよび2Dプロジェクトを開発し、プロセスを視覚化してウィンドウアプリケーションを開発できます。