-- Views
February 10, 26
スライド概要
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
Unity のコンサルタントが 紹介するパフォーマンス関連の 上級者向けのヒントとコツ
Nicolas Borromeo Unity Technologies シニアソフトウェア開発コンサルタント
昨年の講演の続き アジェンダ さまざまな分野の上級者向けヒント ⎯ グラフィックス ⎯ エディターのパフォーマンス ⎯ アセットの読み込み
グラフィックス
中間テクスチャ その検出 バックバッファ ではなく RT にレンダリングする ⎯ GPU (特にモバイルプラットフォーム) ではコストのかかる 最終ブリットパス が必要 フレームデバッガー または レンダーグラフビューアー で検出できる ⎯ 使用されている _CameraXXXXAttachment レンダーテクスチャはあるか ⎯ いずれかの形態の最終 ブリットパス (PP 経由またはスタンドアロン) があるか
中間テクスチャ そのデバッグ SRP アセット設定、描画機能、または マテリアル設定 で強制できる 色: ポストプロセス、ディファード、HDR、MSAA (明示的な解像度なし) カメラスタッキングなど 深度: フォワードクリップまたはアルファクリップ、DBuffer デカール、深度優先などを使った HDRP マテリアル SRP (URP/HDRP) コードを ブレークポイント にして、必要な理由を見つける ⎯ ⎯ URP のレンダーグラフ: UniversalRenderer の RequiresIntermediateAttachments URP の互換性: UniversalRenderer の createColorTexture/createDepthTexture
中間テクスチャを作成する URP ソースコードを ブレークポイントにする
ポストプロセスボリューム 更新コスト 変更の予定がない場合は、ポストプロセス Volume Update を無効にする ⎯ URP アセットの 追加/詳細プロパティ を表示する必要がある ⎯ 散発的な変更はスクリプトによってトリガーできる
レンダーパス レンダラーを減らすヒント シャドウマップの場合は Light.layerShadowCullDistances を使う ⎯ ⎯ 特定のレイヤーに異なるシャドウマップの 描画距離 を指定する 同じことを メインレンダリング に適用できる (Camera.layerCullDistances) HDRP の深度プリパス の場合はプリパスを必要とする機能の使用を減らす ⎯ ⎯ フォワードレンダリング (透明度など)、アルファクリッピング、またはマテリアルへの デカールの追加 マテリアル LOD (LOD ごとのマテリアル) を使って遠くにある機能を無効にする
シーンのルート 更新コスト ルートオブジェクト ごとの Unity 並列化作業 ⎯ レンダラー AABB の更新 ⎯ アニメーション変換の書き込み 動的な GO の 単一ルート を避ける
プロファイラーで バウンディングボリュームの 並列化を見る
メモリレス深度 最新のモバイル API で Memoryless Depth (メモリレス深度) テクスチャの使用を検討 ⎯ これらのレンダーテクスチャから深度データを読み取らないことを条件にする ⎯ スクリプトで作成されたレンダーテクスチャにも 手動で適用 できる
エディターのパフォーマンス
C# のコンパイル アセンブリの分割 アセンブリの依存関係チェーンが 並列化 の機会として評価される ⎯ 依存関係を減らし、大きなアセンブリ を分割する アセンブリごとに オーバーヘッド がある ⎯ 連続する小さなアセンブリ を可能な限り結合する Needle Compilation Visualizer などのツールでプロファイルする
アセンブリの コンパイル時間を確認
ドメインリロード コストの削減 コンパイル 時または 再生モードの開始 時にドメインがリロードされる ⎯ 再生モード のオプションから再生モードを開始するときに無効にできる ⎯ Project Auditor の Domain Reload セクションのアドバイスを使って無効にする準備を行う InitializeOnLoad メソッドは、ドメインのリロード中に呼び出される ⎯ ⎯ 非 RuntimeInitializeOnLoad メソッド (再生モードの開始時に実行される) ネイティブのプロファイラー、カスタムマーカーなどを使って プロファイル する https://docs.unity3d.com/6000.0/Documentation/Manual/domain-reloading.html
InitializeOnLoad メソッドを プロファイルする
シェーダーのコンパイル ランタイムコンパイル: シェーダーの初回使用時 に行われる ⎯ ゲーム中のスパイクを回避するために シェーダーを事前準備 できる ⎯ 詳細は、Unite 2024 パフォーマンスのヒントとコツ の講演を参照 ビルドコンパイル: ビルド時に 考えられるすべての必要なシェーダー で行われる ⎯ シェーダーストリッピング手法 を使って、ビルドされるシェーダーを減らす ⎯ ランタイム シェーダーのメモリ の負荷を減らすのにも役立つ
ビルドシェーダーのコンパイル バリアントとキーワード キーワードは 動的ブランチのパフォーマンス 問題回避のためにバリアントを 生成する シェーダー機能 (SF):マテリアルで使用される順列に基づいてバリアントを生成する マルチコンパイル (MC):ランタイムに必要になる場合に備えて、考えられるすべてのバリアントを 生成する バリアント = マテリアル SF 使用順列 X シェーダー MC 順列
ビルドシェーダーのコンパイル バリアントとキーワード シェーダーは SF キーワードと MC キーワード、ON オプションと OFF オプション (最大 4 つのバリアント) を持つ MaterialA が SF ON、MaterialB が SF OFF = 4 バリアント MaterialA と MaterialB のどちらも SF ON = 2 バリアント
シェーダーの例を見る
ビルドシェーダーのコンパイル ストリッピングバリアント shader_feature キーワードのマテリアル使用量を減らす 可能な場合は multi_compile キーワードの代わりに shader_feature を使う キーワードの代わりに 動的分岐 を使うことを検討する (均一ベースの if) ⎯ ⎯ GPU プロファイラーの パフォーマンス (特に占有率) を監視する 手動 または 自動 (6.3 以降) https://docs.unity3d.com/6000.3/Documentation/Manual/urp/shader-stripping-fog.html
ビルドシェーダーのコンパイル ストリッピングバリアント IPreprocessShaders を使ってバリアントを 拒否する ⎯ 既知のバリアントを 使わない ⎯ バリアントを ランタイムにコンパイルしない ⎯ 厳しいバリアント照合 で検証する SRP で独自の削除機能を実装する ⎯ SRP アセット 設定に基づいてバリアントを 減らす ⎯ IShaderVariantStripper インターフェース ⎯ URP の ShaderScriptableStripper https://docs.unity3d.com/6000.2/Documentation/ScriptReference/Build.IPreprocessShaders.OnProcessShader.html
ビルドシェーダーのコンパイル その他のヒント Unity のデータツール を使ってシェーダーバリアントとキーワードを分析する キーワードが影響する ステージ (頂点、フラグメント、その両方) を定義する 不要なグラフィックス API を削除する (例: Vulkan のみのプロジェクトで OpenGL を削除する)
アセットのロード
アセットのロード バックグラウンドでのロード ロードスレッドが バックグラウンドでのロード を 開始する ⎯ ⎯ 一度に 1 つのアセット 依存関係 (テクスチャなど) もロードされる アセットのオブジェクトの デシリアライズ が行わ れる ⎯ ⎯ コンテナのみ の GO を減らす スキンモデルに Optimize Game Object を使う
アセットのロード バックグラウンドでのロード アセットの コンテンツがロード される ⎯ ⎯ ⎯ オーディオのプリロード (無効にする) 非同期アップロードパイプライン (調整する) シェーダーのロード (バリアントを 削除する) https://unity.com/blog/engine-platform/understanding-the-async-upload-pipeline
アセットのロード インテグレーション 最終的なロードステップ (統合) は メインスレッド で行われる ⎯ ロードされたアセットとシーンオブジェクトでの Awake/OnEnable 呼び出し Application.backgroundLoadPriority タイムスライスの統合 ⎯ アセット単位の粒度 を統合して フレームあたりの MS 消費を最大化する
アセットのロード 統合 ゲームのニーズに応じて統合時間を変更する ⎯ ⎯ ⎯ ロード画面で コンテンツをロードするときは増やす ゲームプレイ中に コンテンツをストリーミングする場合は減らす アセット/スクリプトの初期化の 手動でのタイムスライス化 を検討する
レベルロードプロファイラーの キャプチャを見る
まとめ
まとめ 中間テクスチャ の使用率を評価して GPU コストを減らす スクリプトのコンパイル 時間を調べてエディターの応答性を向上させる すべての シェーダーストリッピング オプションを活用してビルド時間とロード時間を改善する ロード時間 を分析して容易に実現できる最適化を見つける マテリアルの LOD を使って遠くにあるオブジェクトの機能を無効にする
Thank you