いつも Unity ブログをご覧になっている方は、最近の一連の投稿にお気づきでしょうか。グラフィックとアセット、プロファイリング、メモリ、コードアーキテクチャ 、物理、UI、オーディオなど、モバイルゲームを最適化するための多くの素晴らしいヒントが紹介されています。
今回は、コンソール機のハイエンドグラフィックスを最適化するために役立つヒントをご紹介します。バッチ数を減らす方法や、使用を避けるべきシェーダー、レンダリングオプションなどのポイントをご紹介します。これらのヒントは、PC やコンソール機のゲーム向けの高度な最適化技術をまとめた新しい e ブックに収録されているものです。この e ブックは無料でダウンロードできます。
Xbox や PlayStation での開発は、PC での開発に似ていますが、これらのプラットフォームには独自の課題があります。スムーズなフレームレートを実現するには、GPU の最適化が重要です。
まず、GPU の負荷が高いフレームを探します。Microsoft と Sony から、CPU と GPU の両方についてプロジェクトのパフォーマンスを分析するための素晴らしいツールが提供されています。Xbox One 向けの PIX と PlayStation 向けの Razor は、これらのプラットフォームで最適化を行う場合にぜひ使いたいツールです。
それぞれのネイティブプロファイラーを使って、フレームにかかっているコストを個別のパーツに分解します。これは、グラフィックスのパフォーマンスを向上させるための出発点となります。
他のプラットフォームと同様に、コンソール機での最適化も、ドローコールのバッチを減らすことが主眼となります。これを行う上でいくつかのテクニックがあります。
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 は、ウェーブフロントの占有率を詳細に示します。
この『Book of the Dead』の例では、頂点シェーダーのウェーブフロントが緑色で表示されています。ピクセルシェーダーのウェーブフロントは青く表示されています。下のグラフでは、ピクセルシェーダーがあまり動作していないのに、頂点シェーダーのウェーブフロントがたくさん現れています。これは、GPU のポテンシャルを十分に活用できていないということです。
もし、ピクセルの描画と関係ない頂点シェーダーの作業をたくさんしているなら、非効率な描画を行っているということかもしれません。ウェーブフロントの占有率が低いことは必ずしも悪いことではありませんが、シェーダーの最適化や、他のボトルネックのチェックを検討するための指標となります。たとえば、メモリや演算処理周りで処理が固まったりしている場合、占有率を上げることでパフォーマンスが向上する可能性があります。一方で、処理中のウェーブフロントが多すぎると、キャッシュスラッシングが発生し、パフォーマンスが低下します。
皆さんのプロジェクトが HDRP を使っている場合、そのビルトインパスおよびカスタムパスを活用してください。これらは、シーンのレンダリングに役立ちます。ビルトインパスは、シェーダーの最適化に役立ちます。HDRP には、シェーダーにカスタムパスを追加できる注入ポイントがいくつか用意されています。
透明なマテリアルの動作の最適化については、こちらのレンダラーとマテリアルのプロパティに関するページを参照してください。
HDRP の High Quality 設定では、デフォルトで 4K シャドウマップを使用します。シャドウマップの解像度を下げ、フレームのコストへの影響を測定します。ただし、画質の変化をライトの設定で補う必要があるかもしれないことにはご注意ください。
GPU を十分に活用できていない区間がある場合、Async Compute を使用することで、意味のあるコンピュートシェーダーの作業をグラフィックキューに移動させて、並列化することができます。これにより、GPU のリソースを有効に活用することができます。
例えば、シャドウマップ生成時には、GPU は深度のみのレンダリングを行います。この時点ではピクセルシェーダーの作業はほとんど行われず、多くのウェーブフロントが占有されないままとなります。
コンピュートシェーダーの作業を深度のみのレンダリングと同期させることができれば、GPU の全体的な使用率を高めることができます。未使用のウェーブフロントは、スクリーンスペースアンビエントオクルージョンや、現在の作業を補完するタスクに使うことができます。
『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 ブックをダウンロードしてご覧ください。今すぐ実践できる知見が満載です。
Integrated Support サービスについてもっと知りたい、あるいはチームにエンジニアと直接やりとりする窓口や、専門家のアドバイスやプロジェクトのベストプラクティスガイダンスを提供したいとお考えの方は、こちらのページでご案内している Unity のサクセスプランをご検討ください。
私たちは、皆さんの Unity アプリケーションのパフォーマンスを可能な限り引き出すためのお手伝いをしたいと考えています。詳しく知りたい最適化のトピックがありましたら、ぜひコメントでお知らせください。