Skip to content

About

アバターギミックの負荷を検証するツール

Resources

Stars

3 stars

Watchers

0 watching

Forks

Repository files navigation

ギミックの負荷検証ツール

アバター・ギミック開発者向けのUnity内ベンチマークです。元アバターと複数の改変アバターを同じ背景・人数・視点で比較し、ギミックを動かした状態のCPU・GPU負荷を記録します。

NDMFなどのビルド処理を反映したアバターをAv3Emulatorで再生するため、メニューから起動するギミックも、パラメータを指定して計測できます。結果は比較表とグラフで確認でき、HTMLレポートやフレームごとのデータを保存できます。

1.3の主な更新

  • 日本語・英語の表示切り替え:画面上部の「言語 / Language」から、操作画面・結果画面・環境設定・新規レポートの言語をまとめて変更できます。初期設定は日本語です。
  • 翻訳の管理と言語追加:日本語と英語を項目ごとに並べたJSONで管理します。言語の追加方法は翻訳の管理を参照してください。
  • 保存済みHTMLの再利用:「HTMLレポートを開く」は既存のHTMLをそのまま開き、HTMLがない場合だけ生成します。

1.10の主な更新

  • 追加カメラ・RenderTextureのGPU計測:アバターや背景にある追加カメラの描画と、CustomRenderTextureの更新を含めて計測します。重なる描画区間は1回だけ数えます。
  • RenderTextureを使うアバターの扱いを改善:ビルド後の参照を保ち、複数人では描画先をアバターごとに分けます。計測終了時に発生することがあったRT解放エラーも修正しました。
  • 計測対象の説明を追加:Cloth・Joint・Raycastなどの動作条件と、CPU・GPUの数値が表す範囲を計測対象と制約にまとめました。
  • 計測時のバージョンを表示:Unityの結果画面とHTMLレポートで、計測に使ったツールのバージョンを確認できます。

詳しい変更点と更新時の注意は変更履歴を参照してください。

動作環境

  • Unity 2022.3 / Built-in Render Pipeline(動作確認:2022.3.22f1)
  • VRChat SDK Avatars(動作確認:3.10.3)
  • NDMF(動作確認:1.13.1)
  • Av3Emulator(動作確認:3.4.13)
  • アバターが使用するシェーダーやビルド拡張。Modular Avatarを使うアバターにはModular Avatarも必要です。

GPU計測にはWindows 64bit Editor / Direct3D 11が必要です。GPU計測に対応しない環境では、CPUのみを計測します。

導入手順

GitHub ReleasesまたはBOOTHから.unitypackageをダウンロードし、Unityへインポートします。

1. 必要なツールを準備する

VCCでVRChat SDK Avatarsの入ったプロジェクトを用意し、次のツールを導入してください。すでに導入済みのものは、そのまま使えます。

  • NDMF:Modular AvatarをVCCから導入している場合は、依存パッケージとして一緒に導入されます。NDMFだけを追加する場合は、Modular Avatar公式の導入案内からbd_リポジトリをVCCに登録し、対象プロジェクトのManage ProjectでNon-Destructive Modular Frameworkを追加します。
  • Av3Emulator:公式リリースから.unitypackageをダウンロードし、UnityのAssets > Import Package > Custom Package...でインポートします。

計測するアバターが使うシェーダーや、Modular Avatarなどのビルド拡張も導入しておいてください。

2. 本体をインポートする

  1. GitHub ReleasesまたはBOOTHから、.unitypackageをダウンロードします。
  2. UnityのAssets > Import Package > Custom Package...から、ダウンロードしたファイルを選んでインポートします。
  3. Tools > FUKA > ギミックの負荷検証 (Avatar Benchmark)を開きます。

本体と同梱プリセットは、Assets/FUKA/Addon/F_ギミックの負荷検証ツール/に配置されます。

更新するには

新しいリリースの.unitypackageを、同じプロジェクトへインポートします。個別の更新手順は変更履歴と配布ページを確認してください。

追加カメラ対応前の版から更新する場合は、インポート後にシーンを保存し、Unityを再起動してください。 GPU計測用DLLも更新されるため、再起動まで以前のDLLが使われる場合があります。カメラやRenderTextureを含むアバターは、再起動後にツールのアバタービルド欄から再ビルドします。

GPUの計測範囲が変わるため、比較対象は同じ版・同じ条件で計測し直してください。旧形式のJSONは現在の結果画面では読み込めません。保存済みのHTMLレポートは、ファイルをブラウザーで直接開いて閲覧できます。

自分の計測プロファイルや編集用の環境シーンは、Assets/MyBenchmark/など、本ツールのフォルダ外へ保存してください。同梱プリセットを使う場合も、複製してから設定すると、更新時に設定が上書きされるのを防げます。

表示言語

操作画面・結果画面の上部にある「言語 / Language」から、日本語・Englishを選べます。初期状態は日本語です。設定は利用者ごとに保存され、同じPCのほかのUnityプロジェクトでも共通で使います。計測プロファイルには保存しません。

言語を変更すると、操作画面・結果画面・環境設定のInspectorが一緒に切り替わります。計測・プレビュー中は切り替えを固定します。新しく作成するHTMLレポート・テキスト要約にも同じ言語を使います。保存済みのレポートファイルは変更しません。

アバター名・シーン名・パラメータ名などの入力内容や外部ツールのエラー原文は、そのまま表示します。過去に保存した文章も元の言語が残る場合があります。

翻訳はTranslations.jsonで、項目ごとに日本語・英語を並べて管理しています。言語追加とテストの手順は翻訳の管理を参照してください。

計測の流れ

Tools > FUKA > ギミックの負荷検証 (Avatar Benchmark)を開き、上部の「新規作成」から計測プロファイルを作ります。同梱プリセットを使う場合は、プロファイルのアセットを自分のAssets内へ複製して「計測プロファイル」欄に登録してください。

画面の1~5に沿って設定します。

  1. アバターを登録:ヒエラルキーから、Avatar Descriptorが付いた元アバターと計測対象のルートを登録します。元アバター1体と計測対象1体以上が必要です。対象は複数追加でき、表示名は登録時にオブジェクト名が入り、その後は手動で変更できます。
  2. アバターをビルドしてパラメータを取得:「全アバターを一括ビルド」、または各アバターの「ビルド」を押します。アバターの複製にSDK・NDMF・Modular Avatarなどのビルド処理を適用し、計測用のPrefabを保存します。
  3. 計測時のパラメータを設定:ギミックを起動するBool / Int / Floatと値を、ビルド後の一覧から指定します。異なる設定を比較したい場合は、同じアバターを計測対象にもう一度追加します。指定しないパラメータには、エミュレーターの初期値を使います。
  4. 計測環境(シーン)を登録:背景・配置ピン・カメラを保存したシーンを、Projectから登録します。同梱プリセットには環境シーンを登録済みです。
  5. 計測条件を設定して開始:人数とカメラを選びます。手順3の「プレビュー動作確認」でギミックの動作を確認し、プレビューを終了してから「負荷計測を開始」を押します。

計測プロファイルは、アバター・パラメータ・環境・人数・カメラの選択を保存するアセットです。環境シーンは、背景・配置ピン・カメラそのものを保存します。

計測が終了して元のシーンへ戻ると、計測結果レポートが自動で開きます。後から「計測結果レポートを開く」で開き直すこともできます。結果画面の「HTMLレポートを開く」から、ブラウザーで比較表や時系列グラフを確認できます。

結果画面・HTMLレポート・テキスト要約の冒頭には、計測時のツールバージョンを表示します。バージョンはJSONにも保存し、ツールを更新してから結果を開き直しても、計測時の値を保持します。バージョンが保存されていない結果は「未記録」と表示します。

開始ボタンの上には想定所要時間を、結果画面とレポートには実際にかかった時間を表示します。想定所要時間は、アバターの生成・初期化・計測を含む概算です。計測の自動延長やGPU結果の待機により、長くなる場合があります。

再ビルドとプレビュー

プレビューと計測には最後に成功したビルドを使います。ビルド済みのPrefabがあれば、元アバターのシーンを閉じて環境シーンへ移動しても、そのままプレビュー・計測できます。

登録欄はヒエラルキー上のアバターを受け付けます。ProjectのPrefabは、ヒエラルキーに配置してから登録してください。別のアバターへ差し替えた場合や登録を解除した場合は、その欄を未ビルドに戻します。同じアバターの編集やシーン移動では、保存済みビルドを維持します。

アバターの編集内容を反映したいときは、手順2でそのアバターの「再ビルド」を押してください。追加したアバターだけを「ビルド」することもできます。他のアバターのビルドとパラメータ設定は保持します。

ビルド・再ビルドにはシーン上の元アバターが必要です。参照できない場合はビルドボタンが無効になるため、元のシーンを開くか手順1で登録し直してください。

再ビルド後はパラメータ名を自動照合し、設定した値を引き継ぎます。MAや最適化ツールの処理で名前が変わった場合は、表示された該当項目を選び直してください。

プレビューには対象アバターのビルドと手順4の環境登録が必要です。ボタンがグレーアウトしているときは、手順4・5まで設定を進めてください。UnityがEditモードで、コンパイル・インポートが完了しているときに使えます。最初の環境と、選択した最初のカメラ・人数で再生し、「計測・プレビューを終了」で戻れます。

エラーが発生した場合

描画やコンポーネントのエラーがConsoleに出ても、計測・プレビューを続けます。計測中の画面には、どのアバターの計測時にエラーが発生したかを表示します。結果画面とレポートの所要時間の下にも、対象アバター・注意文・エラー内容を残します。同じ条件で繰り返すエラーは発生回数をまとめます。

取得できた数値は保存しますが、動作や描画の欠落、ログ出力の負荷が数値に影響する可能性があります。シーンを読み込めないなど、処理自体を続けられない場合は中断します。

計測の仕組み

各回の計測前にアバターを生成し、初期化完了から1秒後にパラメータを一度適用します。さらに1秒以上待ってから計測を開始します。PhysBone・Constraint・Rigidbody・Joint・Cloth・VRCRaycastなどは、Unity・SDK・エミュレーターとアバターの設定に従って動作します。実際のパラメータ値と有効コンポーネントは動作記録に残ります。

動かす・掴む・衝突させるといった入力は自動では行いません。静止、接触、スリープ、画面内外などの状態によって負荷が変わるため、計測したい状態になっているかをプレビューで確認してください。

複数体の計測では、書き込み先のRenderTextureと、それを参照するマテリアル・アニメーションなどをアバターごとに分けます。同じアバター内のカメラとマテリアルは同じ描画先を参照し、通常の画像テクスチャやメッシュは共有します。RenderTextureのGPUメモリ使用量は人数に応じて増えますが、実使用メモリ量自体は計測していません。

アバター再生中の同じ期間でCPU・GPU・Unityのフレーム時間を計測します。必要なデータが足りない場合は、上限付きで自動延長します。取得できた数値は残し、比較に必要なデータが不足した結果は参考値として表示します。

同じ背景・人数・カメラで各対象を3回計測し、2回目は順番を逆にします。複数回の結果をまとめることで、一時的なバックグラウンド処理や計測順による偏りの影響を抑えます。同じ元アバターを別に生成して計測する「対照試験」も行い、同じものを測ってもどれくらい数値がずれるかを確認します。

バックグラウンド処理の影響を完全に取り除けるものではないため、計測中はほかの重い処理を避けてください。

各区間は同じ乱数シードと入力手順で開始します。実時間を参照するシェーダーや外部入力の位相は、区間ごとに異なることがあります。

同梱プリセット

Presetフォルダに、環境シーンを設定済みの計測プロファイルを収録しています。アバターは登録されていないため、自分のアバターを登録して使ってください。

計測プロファイル 背景・照明
Benchmark_Basic.asset 基準ライトのみ。部屋や床のない背景
Benchmark_Room_Baked.asset ベイク済みのラウンジ
Benchmark_Room_RealTime.asset 同じラウンジに、影付きのリアルタイムライトを2灯追加

実際の負荷は、アバターのシェーダーや描画サイズ、端末によって変わります。ラウンジの構成や編集方法はラウンジ背景を参照してください。

背景・配置・カメラを変更する

手順4の「計測用環境シーンを新規作成」、またはTools > FUKA > 負荷検証の環境シーンを新規作成 (New Environment)で、配置ピン・カメラ・基準ライトを持つシーンを作成できます。同梱の環境シーンを編集する場合は、自分のAssets内へ複製して使ってください。

  • 背景:部屋や照明をシーンに配置します。シーンの照明設定も使います。
  • 配置ピン:最大10本。人数ごとに配列の先頭から必要な本数を使います。
  • 計測の視点用カメラ:複数登録できます。Sceneビューの視点から追加することもできます。

ギミックや背景のRenderTexture用カメラは、視点一覧への登録は不要です。計測中に実際に描画される追加カメラは、自動でGPU計測に含まれます。

環境シーンを保存してから、計測プロファイルの手順4へ登録します。人数の上限は、登録した環境のうち最も少ない配置ピン数です。ピンを減らして上限が下がると、それを超えた人数の選択は自動で解除されます。すべて解除された場合は、人数を選び直してください。

各環境で1台以上のカメラを選択してください。カメラの選択は名前や並び順が変わっても保持され、削除された場合は再選択を求めます。

複数の環境・人数・カメラを選ぶと、その組み合わせごとに計測します。

結果の読み方

比較画面とレポートの「結果に影響する可能性のあるUnity設定」には、計測開始時の影品質・Pixel Light Count・テクスチャやLODなどの設定を表示します。プロジェクトの画質設定は変更しません。計測後にUnity設定を変更しても、保存した結果には計測開始時の値が表示されます。

1回の計測結果は、その期間内の有効フレームの中央値で表します。比較表の代表値は、各回の中央値をさらに中央値でまとめた値です。「元との差」は同じ条件での1回目同士、2回目同士を組にして計算するため、表示された代表値の単純な引き算と異なる場合があります。

表示 意味
中央値 計測期間の代表的な重さ
標準偏差 平均の周りにどれくらい値が散らばったか
P95 95%のフレームがその値以下になる位置
最大値 計測期間で最も重かったフレーム

標準偏差は中央値の誤差幅ではありません。重いフレームも保持し、時系列グラフには小区間の中央値と最小~最大を表示します。計測ごとに求めた中央値の最小~最大も確認できます。

環境シーンを並べて比べる

同じ対象・人数・視点名で複数の環境シーンを計測すると、結果画面の「環境シーンを比較」で横並びの棒グラフを表示できます。「対象・人数・視点」から比較したい条件を選んでください。例えば、同じアバターを10人描画したときの、密集・中間・分散の3シーンを比較できます。

HTMLレポートにも同じ比較を表示します。「環境シーンを比較」から対象の行を開くと、各シーンのGPU時間・CPU時間がそれぞれ共通の目盛で並びます。背景を含む計測値で、人数や視点名が異なる結果は混ぜません。参考値やデータなしの表示も維持します。

保存済みの結果も、Unityの結果画面では再計測せずに比較できます。「HTMLレポートを開く」は既存のHTMLをそのまま開きます。HTMLがない場合だけ、保存された計測データから生成します。既存のHTML・テキスト要約・JSON・CSVは上書きしません。

CPU・GPU・フレーム時間

表示 計測する範囲
GPU時間 計測カメラ・追加カメラの描画、影生成、CustomRenderTextureの更新区間。RenderTextureへの描画も含め、重なる区間は1回だけ数えます。
CPU時間 エミュレーターを含むメインスレッドの更新処理(PlayerLoop)。
フレーム時間 Unityの実際の更新間隔。

GPU時間にはCPUからの命令の到着待ちを含む可能性があり、純粋なGPU演算時間ではありません。非同期で返るGPU結果は、結果が届いた時刻ではなく、元のUnityフレームに対応付けて記録します。

Rigidbody・Joint・Clothも、Playモードで動作する状態なら計測対象に含まれます。ただしCPU値は、物理演算のワーカースレッド、レンダースレッド、音声DSPの処理時間を合算した値ではありません。Editor側でPlayerLoopの外に回るカメラの描画準備も対象外です。部品ごとの対応範囲とVRChat上での違いは計測対象と制約を参照してください。

GPU計測では、各描画区間の開始前と終了直後に命令を送信し、終了の記録が後続のCPU処理まで保留される影響を抑えています。送信は非同期で行い、計測用の追加描画は発生させません。命令送信自体の影響もあるため、比較対象は同じ計測方式・条件で計測してください。

比較結果と参考値

有効な記録があれば中央値・標準偏差・P95・最大値・グラフを表示します。有効フレーム数や取得率などの条件を満たさない結果は「参考値」とし、比較に使える計測が何回あったかと、判定理由を併記します。計測データの不足を理由に、取得済みの値を消すことはありません。

対照試験には今回の一括計測中に取得した値を使い、過去の計測結果は判定基準に使いません。対照のずれが大きい場合も差分は表示し、注意を付けます。ずれに埋もれる差は増減を断定しません。対照のずれは再現性の目安で、計測方式の正確さの保証や統計的な信頼確率ではありません。

アバターなしの値は、その背景と実行環境の基準です。結果は端末・Unity・エミュレーターの状態に依存し、VRChat内のFPSへの直接換算やCPU・GPU時間の加算には使えません。GPUの0.000 ms表示には、計測分解能以下の値も含まれます。

描画回数

結果画面・HTML・テキスト要約には、1フレームあたりのDraw Calls(描画命令)とSetPass(シェーダーパスの切り替え)の中央値を表示します。背景を含むUnityのフレーム全体の回数で、カメラ別・アバター別の内訳ではありません。Editorの描画も影響し得るため、処理時間を説明する補助値として使います。

代表値は各回の計測で求めた中央値を、さらに中央値でまとめた値です。「元との差」は同じ背景・人数・視点で同じ回に計測した元アバターとの差の中央値です。すべての回の値が揃わない場合や計測が中断した場合、差は「—」にします。「取得回数」は、結果がある回数 / 計測予定の回数です。CPU・GPU時間の増減判定を読む際の補助値として使えます。

現在の計測形式で保存した結果は、後から開き直せます。「HTMLレポートを開く」は既存のHTMLを再生成せずに開きます。HTMLがない場合だけ、その時点の選択言語で生成します。再計測は不要で、既存のテキスト要約・JSON・CSVも変更しません。

ビルド後のアセット統計

ビルド状態にはポリゴン数とテクスチャ容量を表示します。

  • ポリゴン数:非表示のRendererも含めた三角形換算数です。同じメッシュを複数のRendererが使う場合は、それぞれ加算します。
  • テクスチャ容量:圧縮形式・ミップ・面数などから求める推定値で、表示とツールチップはMB単位です。同じアセットは1回だけ数え、アニメーションの差し替え先やメニュー画像も含めます。RenderTextureは別扱いです。

これらはアセットの静的な統計です。描画時の負荷やGPU全体の実使用メモリは計測結果と合わせて判断してください。

保存先

保存先 内容
Logs/AvatarBenchmark/日時_計測対象の表示名/report.html 比較表と時系列グラフ
同フォルダの summary.md テキスト要約
同フォルダの report.json 計測条件、集計、動作記録
同フォルダの frames.csv 全フレームの計測データ
同フォルダのPNG 各条件の確認画像
Assets/_FukaAvatarBenchmark/ 計測用ビルドのキャッシュ
Logs/AvatarBenchmarkBuild/ ビルド時の元データ保護記録

結果フォルダは、例えば20260911_120000_ギミックA_ギミックBのような名前になります。一括計測では計測対象の表示名を登録順に並べ、プレビューでは再生したアバターの表示名を使います。フォルダ名に使えない文字は_に置き換え、長い場合は保存先全体の長さも考慮して末尾を…で省略します。同名の保存先がある場合は_2などの連番を付けます。

計測終了・中止時は元シーンへ戻り、変更したPlay設定・描画待機設定を復元します。アバター参照を復元するときは、元のシーンを開いてください。ビルドキャッシュを削除した場合は再ビルドが必要です。

ネイティブコードのビルド

GPUタイムスタンプのネイティブコードはEditor/NativeSource/GpuTimestamps.cppです。変更時のビルド手順はBUILD.mdにあります。

不具合・改善の提案

GitHub Issuesへお寄せください。不具合の場合は、再現手順・Unityのバージョン・エラー内容を添えていただくと確認しやすくなります。

ライセンス

本ツールのコード・ドキュメント・同梱の背景素材(モデル、テクスチャ、マテリアル、シーン、ベイクデータ)は、MIT Licenseで提供します。

依存するVRChat SDK、NDMF、Av3Emulatorなどの外部パッケージや、利用者が追加するアバター・ギミック・シェーダーには、それぞれのライセンスが適用されます。

作者:FUKA

About

アバターギミックの負荷を検証するツール

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages