Unityの検索機能

Asa’s tips for shader profiling and optimization

Asa Reed 氏の非常に役立つヒントをご紹介します。頂点シェーダーやフラグメントシェーダー、デバッグツールの選択方法、そして主要な最適化を行う人気の 7 つの方法について説明しています。

頂点シェーダーとフラグメントシェーダー、どちらを選ぶべきか?

頂点シェーダー:一番の懸念がパフォーマンスなら、頂点シェーダーが最もよい選択肢と考えられます。頂点シェーダーはメッシュのすべての頂点に作用するのに対し、フラグメントシェーダーはこれらの頂点で構成される三角形の中のすべてのピクセルに作用します。

頂点シェーダーには制限もあります。頂点シェーダーでは、正確なライティングデータを取得することも、テクスチャマッピングを実行することもできません。とはいえ、フラグメントシェーダーとは異なり、頂点シェーダーでは UV テクスチャ座標を任意の数で変更することができます(例えば、何らかの形でサーフェスエフェクトのアニメーション化を行う場合など)。

Unity-shader-optimization-vertex-shader

頂点シェーダーを使用したモデルの例(頂点シェーダーとフラグメントシェーダーの例より).

頂点シェーダーでのライティングエフェクトとサーフェスエフェクトの実行速度は速くなる傾向にありますが、結果としてビジュアルクオリティーと忠実度は低下します。GPU スキニングなど、特にジオメトリ(頂点)をターゲットとした操作は常に頂点シェーダーで行う必要があります。

フラグメントシェーダー:ハイエンドなビジュアルや興味を引くサーフェスエフェクトを目指していて、滑らかで正しいライティングが必要な場合は、フラグメントシェーダーの使用を検討してみてください。ただ、フラグメントシェーダーでは常に「フラグメントシェーダーへ何を加えているのか」を明確にした上で、使用には細心の注意を払い、さらにサーフェスエフェクトの作成に関する操作で簡略化できるものがあれば、何でも取り入れるくらいの意気込みが必要です。それが難しいという事であれば、頂点シェーダーへ移行してください。

Unity-shader-optimization-vertex-and-fragment-shaders

頂点シェーダーとフラグメントシェーダーの両方を使用した同じモデル(頂点シェーダーとフラグメントシェーダーの例より).

特に Unity では、シェーダーコード内の Unity ビルトイン機能の #pragma define やその他使用したものについては、すべて書き留めるようにしてください。アルファの更新のような単純作業をしていると、シェーダーに極度に大きな負担がかかっているとは考えがおよばないものですが、同じシェーダーが「#pragma surface surf BlinnPhong」を定義すると、Blinn-Phong ライティングを計算するために相当の数の計算がシェーダーに挿入されます。こういったライティングの define によって追加されたコードを確認するには、Unity のインストールディレクトリ内にある lighting.cginc ファイルをお読みください。さらなる詳細については次のドキュメントを参照してください: サーフェスシェーダーでのカスタムライティングモデル.

シェーダーのプロファイリング

Unity のFrame debuggerでは、実行中の再生を特定のフレームで停止させて、そのフレームのレンダリングに使用される個々のドローコールを確認できます。また、デバッガーでは、ドローコールを一覧表示するだけでなく、それらをステップ実行することもできるため、シーンがどのようにグラフィック要素で構成されているかを詳細に確認できます。

Unity-shader-optimization-frame-debugger

Unity のフレームデバッガー

2017.1 にはジオメトリバッチングに関する情報も含まれており、バッチングされるように設定されているにもかかわらず特定のメッシュがバッチングされない場合その理由についての具体的なフィードバックも提供いたします。

他にも特定ハードウェアでのシェーダーデバッグ用に大変有用な外部ツールがあります。

  1. iOS と Mac OS の場合:Xcode には優良なフレームプロファイラーが組み込まれており、特定のフレーム内で GPU が使用しているメモリをすべてキャプチャーする、といった任意の処理処理などを行うことが可能です。描画コードの重要な部分を確認してドリルダウンし、描画対象のネストされたヒエラルキービューを確認できる camera.render や、各シェーダーがレンダリングの合計時間に及ぼす影響を確認できる FPS タブといったこともできます。

    Unity-shader-optimization-xcode_profiler

    Xcode のフレームプロファイラー。

  2. PC と Mac の場合:RenderDoc と Intel GPA ツールなら、細かい機能まで便利に使用できます。また、ほとんどのハードウェアと互換性がある場合が多いです。

  3. ARM Mali などのモバイルチップセット、または PS4、Xbox、Nintendo Switch などの特定のハードウェアをターゲットとしてパフォーマンスや不正確な出力のデバッグを行う場合は、常にメーカー独自のフレームデバッガー(フレームプロファイラーまたはフレームアナライザーと呼ぶ場合もあります)を使用してください。このような独自のツールなら、チップセット向けの最も正確なデータがほぼ常に用意されているほか、上記の汎用ツールに比べて拡張データセットが用意されている可能性も高くなります。

シェーダーを最適化する 7 つの主な方法

通常、フレーム毎に見ると、シェーダーコードで実行される処理量はゲームコードの処理量よりもはるか多くなっています。次の最適化を試すことでパフォーマンス/FPS の効率を改善し、滑らかな作業を実現しましょう。

  1. 非定数の演算は控える。定数または「動的均等」(例:x=4/33、x=4xsin(24))を使用してください。
  2. スカラー値(float、int)はベクトル値(float3、float4)よりも前に乗算する。
  3. 可能な限り、アルファテスト(主にモバイルに適用)の場合を含め、破棄の指示を避ける。オーバードローに注意してください。
  4. 可能な限り、計算を頂点シェーダー上に維持する。
  5. 可能な限り、ベクトル処理にライトマスクを指定する(結果のコンポーネントの一部を使用する場合)。
  6. 動的に設定された値/不均等(if-else、loop)に基づく分岐を避ける。
  7. 操作(discard()、floor() など)がレンダラーモデル(OpenGL 2、OpenGL 3、OpenGL ES など)やハードウェアに及ぼす影響を確認する。
その他のリソース

シェーダーに関するドキュメントとチュートリアル:

今後のためにうかがいます。このコンテンツはいかがでしたか?

もっと読みたい いまいちです
OK

弊社のウェブサイトは最善のユーザー体験をお届けするためにクッキーを使用しています。詳細については、クッキーのポリシーのページをご覧ください。