Unity を検索

コンソール機向けゲームのグラフィックス最適化に関する専門家からのヒント集

2021年11月3日 カテゴリ: ゲーム | 12 分 で読めます
FPS Sample Screenshot
FPS Sample Screenshot
取り上げているトピック
シェア

いつも Unity ブログをご覧になっている方は、最近の一連の投稿にお気づきでしょうか。グラフィックとアセットプロファイリング、メモリ、コードアーキテクチャ物理、UI、オーディオなど、モバイルゲームを最適化するための多くの素晴らしいヒントが紹介されています。

今回は、コンソール機のハイエンドグラフィックスを最適化するために役立つヒントをご紹介します。バッチ数を減らす方法や、使用を避けるべきシェーダー、レンダリングオプションなどのポイントをご紹介します。これらのヒントは、PC やコンソール機のゲーム向けの高度な最適化技術をまとめた新しい e ブックに収録されているものです。この e ブックは無料でダウンロードできます。

コンソール機向けにグラフィックスを最適化する

Xbox や PlayStation での開発は、PC での開発に似ていますが、これらのプラットフォームには独自の課題があります。スムーズなフレームレートを実現するには、GPU の最適化が重要です。

Forest

パフォーマンスのボトルネックを特定する

まず、GPU の負荷が高いフレームを探します。Microsoft と Sony から、CPU と GPU の両方についてプロジェクトのパフォーマンスを分析するための素晴らしいツールが提供されています。Xbox One 向けの PIX と PlayStation 向けの Razor は、これらのプラットフォームで最適化を行う場合にぜひ使いたいツールです。 

それぞれのネイティブプロファイラーを使って、フレームにかかっているコストを個別のパーツに分解します。これは、グラフィックスのパフォーマンスを向上させるための出発点となります。

バッチ数の削減

他のプラットフォームと同様に、コンソール機での最適化も、ドローコールのバッチを減らすことが主眼となります。これを行う上でいくつかのテクニックがあります。

  • オクルージョンカリングを使って、前景のオブジェクトの後ろに隠れているオブジェクトを削除し、オーバードローを減らします。この場合、CPU での処理が増えるので、プロファイラーを使い、GPU から CPU へ作業を移すことが有益であることを確認してください。 
  • GPU インスタンシングを行うと、同じメッシュやマテリアルを共有するオブジェクトが多数ある場合に、バッチを減らすことができます。シーン内のモデルの数を制限することで、パフォーマンスを向上させることができます。これを上手く行うと、繰り返しの作業を行わずに複雑なシーンを構築することができます。

SRP Batcherバインドとドローの GPU コマンドをバッチングすることにより、ドローコール間の GPU 設定を減らすことができます。マテリアルを必要な数だけ使ってもこの SRP バッチングの恩恵を受けることができますが、互換性のある少数のシェーダー(例:URP と HDRP では Lit シェーダーと Unlit シェーダー)だけを使うようにします。

グラフィックスジョブを有効化する

PlayStation や Xbox のマルチコアプロセッサーを活用するには、Player Settings > Other Settings でこのオプションを有効にします。Graphics Jobs (Experimental) を有効にすると、Unity はレンダリング作業を複数の CPU コアに分散させ、レンダースレッドの負荷を軽減します。詳細は、Multithreaded Rendering and Graphics Jobs チュートリアルを参照してください。

ポストプロセッシングのプロファイリングを行う

コンソール機向けに最適化されたポストプロセッシングアセットを使用するようにしてください。元々 PC 向けに作成されたアセットストアのツールを Xbox や PlayStation のゲームで使うと、必要以上にリソースを消費する場合があります。念のため、ネイティブプロファイラーを使ってプロファイルしておきます。

テッセレーションシェーダーの使用を避ける

テッセレーションは、シェイプを細分化してより小さくします。これにより、ジオメトリが細かくなり、ディテールの向上が期待できます。テッセレーションが良い効果をもたらすこともありますが(たとえば、『Book of the Dead』のリアルな樹皮の表現)、一般的には、コンソール機向けにはテッセレーションの使用を控えてください。GPU のコストがかさばってしまいます。

ジオメトリシェーダーをコンピュートシェーダーに置き換える

テッセレーションシェーダーと同様に、ジオメトリシェーダーと頂点シェーダーは、GPU 上で 1 フレームにつき 2 回実行されることがあります。1 回は深度のプレパス中、もう 1 回はシャドウパス中です。

GPU 上で頂点データを生成したり修正したりしたい場合は、ジオメトリシェーダーよりもコンピュートシェーダーの方が良い選択となることがあります。コンピュートシェーダーで作業を行うことで、実際にジオメトリをレンダリングする頂点シェーダーを比較的高速かつシンプルなものにすることができます。

良好なウェーブフロントの占有率を目指す

ドローコールを GPU に送ると、その作業は多くのウェーブフロントに分けられ、Unity はそれを GPU 内の利用可能な SIMD に分配します。

各 SIMD の一度に実行可能なウェーブフロントの最大数は決まっています。ウェーブフロントの占有率とは、現在使用されているウェーブフロントの数の最大数に対する比率のことです。これは、GPU のポテンシャルをどれだけ活用できているかを測るものです。PIX と Razor は、ウェーブフロントの占有率を詳細に示します。

Wavefront occupancy
良いウェーブフロントの占有率と悪いウェーブフロントの占有率

この『Book of the Dead』の例では、頂点シェーダーのウェーブフロントが緑色で表示されています。ピクセルシェーダーのウェーブフロントは青く表示されています。下のグラフでは、ピクセルシェーダーがあまり動作していないのに、頂点シェーダーのウェーブフロントがたくさん現れています。これは、GPU のポテンシャルを十分に活用できていないということです。

もし、ピクセルの描画と関係ない頂点シェーダーの作業をたくさんしているなら、非効率な描画を行っているということかもしれません。ウェーブフロントの占有率が低いことは必ずしも悪いことではありませんが、シェーダーの最適化や、他のボトルネックのチェックを検討するための指標となります。たとえば、メモリや演算処理周りで処理が固まったりしている場合、占有率を上げることでパフォーマンスが向上する可能性があります。一方で、処理中のウェーブフロントが多すぎると、キャッシュスラッシングが発生し、パフォーマンスが低下します。

HDRP ビルトインパスおよびカスタムパスの使用

皆さんのプロジェクトが HDRP を使っている場合、そのビルトインパスおよびカスタムパスを活用してください。これらは、シーンのレンダリングに役立ちます。ビルトインパスは、シェーダーの最適化に役立ちます。HDRP には、シェーダーにカスタムパスを追加できる注入ポイントがいくつか用意されています。

Use HDRP injection points to customize the pipeline.
HDRP の注入ポイントを利用して、パイプラインをカスタマイズしよう。

透明なマテリアルの動作の最適化については、こちらのレンダラーとマテリアルのプロパティに関するページを参照してください。 

シャドウマッピングのレンダーターゲットのサイズを小さくする

HDRP の High Quality 設定では、デフォルトで 4K シャドウマップを使用します。シャドウマップの解像度を下げ、フレームのコストへの影響を測定します。ただし、画質の変化をライトの設定で補う必要があるかもしれないことにはご注意ください。 

Async Compute を活用する

GPU を十分に活用できていない区間がある場合、Async Compute を使用することで、意味のあるコンピュートシェーダーの作業をグラフィックキューに移動させて、並列化することができます。これにより、GPU のリソースを有効に活用することができます。 

例えば、シャドウマップ生成時には、GPU は深度のみのレンダリングを行います。この時点ではピクセルシェーダーの作業はほとんど行われず、多くのウェーブフロントが占有されないままとなります。

Async Compute can move compute shader work in parallel to the graphics queue
Async Compute は、コンピュートシェーダーの作業をグラフィックスキューに移動させて、並列化することができる。

コンピュートシェーダーの作業を深度のみのレンダリングと同期させることができれば、GPU の全体的な使用率を高めることができます。未使用のウェーブフロントは、スクリーンスペースアンビエントオクルージョンや、現在の作業を補完するタスクに使うことができます。

Optimized render at 30 fps
30fps での最適化されたレンダリング

Book of the Dead』の例では、いくつかの最適化により、シャドウマッピング、ライティングパス、大気の表現の処理にかかる時間を数ミリ秒短縮しています。その結果、フレームのコストを下げ、PS4 Pro で 30fps で動作するようになりました。

Optimizing Performance for High-End Consoles」で触れているパフォーマンスのケーススタディをご覧ください。Unity のグラフィックデベロッパーである Rob Thompson が、『Book of the Dead』を PlayStation 4 に移植した時のことについて説明しています。また、これに対応する「10 Tips for Optimizing Console Game Graphics」を読むと、より詳しい情報が得られます。

パフォーマンス最適化に関するガイド全体をダウンロードする

ヒントとコツの完全なリストを見てみたい方は、下記のリンクから全 92 ページの e ブックをダウンロードしてご覧ください。今すぐ実践できる知見が満載です。 

e ブック(英語)をダウンロードする

Integrated Support サービスについてもっと知りたい、あるいはチームにエンジニアと直接やりとりする窓口や、専門家のアドバイスやプロジェクトのベストプラクティスガイダンスを提供したいとお考えの方は、こちらのページでご案内している Unity のサクセスプランをご検討ください。

お求めのものが見つかりませんでしたか?

私たちは、皆さんの Unity アプリケーションのパフォーマンスを可能な限り引き出すためのお手伝いをしたいと考えています。詳しく知りたい最適化のトピックがありましたら、ぜひコメントでお知らせください。

 

2021年11月3日 カテゴリ: ゲーム | 12 分 で読めます
取り上げているトピック