VRChat アバター最適化メモ
よくあるケース
ポリゴン数
VRChat でアバターのポリゴン数が問題になることは少ない。目安として使われるポリゴン数は7万と3万2千で、これはPC 版アバターパフォーマンスランクが根拠になっている。
Quest ではポリゴン数1万が目標になる。これは Quest 版アバターパフォーマンスランク の Good 評価に相当し、Good は PhysBones が使える中での最高ランクだ。
目次
ボトルネックの特定
タスクマネージャを見る。
確実な方法ではないが、レンダリング解像度を下げてフレームレートが向上すれば、GPU がボトルネックになっている。フレームレートが変化しなければ CPU がボトルネックになっている。
Shiftキーを押しながらVRChatを起動すると表示される起動オプションから、レンダリング解像度を変更できる。
詳細な測定にはプロファイラを使う。
Profilerの使い方と最適化の目安の付け方(前編)【Unity】【Unite 2017 Tokyo】【最適化】
VRChatのワールド内で負荷を計測する方法について【fpsVR】
CPU
ドローコールとは
ドローコールは1フレームの間に GPU に送られた描画命令の数で、この数が少ないほど効率的にレンダリングできる。ドローコールが多いと CPU と GPU 両方に余計な負荷がかかる。Stats の Batches: でドローコール数が確認できる。
What is the cost of changing state?
ボーン
ボーンに PhysBones などの物理演算や IK が加わると負荷が増加するので、Humanoid を動かすのに不要なボーンは可能な限り削除する。
単純なボーンは負荷が低い。たとえば 24,000 頂点で、2,400 ボーンのメッシュを単純にアニメーションさせた場合、Ryzen 5 2600 のマシンで 1,000 FPS のパフォーマンスが出せる。検証に使った FBX ファイル。
Unity で暴れる Joint を鎮めるテクニックは物理エンジン全般に適用できる。
アドオン
ModelBoneDeleter は Unity 上で選択したボーンを削除できる。
PhysBones
VRChatSDK3 以降で使える。PhysBones はダイナミックボーンに比べて 12~20 倍高速に動作する。
コンポーネントやコリジョンの数の制限はPC 版アバターパフォーマンスランクを参照。
ツール
【無料】All_PB_Changer【PhysBone用エディタ】(¥0~¥100)
PhysBones の設定を一括で変更するツール。
外部リンク
【VRChat】PhysBoneの設定方法・Componentについて
PhysBones 技術
キャットカーディガンのコンストスカートについてファンボで記事書こうかと思ったけど簡単すぎて書くこと少ないので画像にまとめました。コンストの数値周りは実際には結構調整入れてるけど基本的にはこんな感じ。 pic.twitter.com/nzb42wPlXp
— むた (@muta_shinki) August 9, 2022
ダイナミックボーン
VRChat では、ダイナミックボーンを適用するボーンの数を 30 以下にすることが推奨されている。
ダイナミックボーンのコライダーの使用も非推奨となっている。ボーンとコリジョンとの衝突判定を総当たりで計算する非効率的なアルゴリズムのため。
グラビティを切る。
外部リンク
【無料】DynamicBoneの使い方が分かる本-Ver1.0(¥0~¥200)
クロス
200 頂点以上のメッシュにクロスをつけるのは非推奨。ダイナミックボーンと同じ計算コストの問題があるため。
VRChatSDK3 以降ならPhysBonesが代替ツールとして使える。
Although not designed as such, PhysBones also serves as a reasonable cloth substitute until such time that we implement our own Cloth component.
PhysBones はクロスを動かすために設計されていませんが、クロスコンポーネントの代替案としては合理的です。新しいクロスコンポーネントが実装されるまでは。出典:https://docs.vrchat.com/docs/physbones#vrcphysbone
外部リンク
GPU
メッシュ
メッシュのレンダラーは2種類ある。動かないメッシュをレンダリングする静的メッシュレンダラーと、ボーンで変形させるメッシュをレンダリングするスキンドメッシュレンダラーとだ。スキンドメッシュレンダラーは負荷が高いので、1アバターにつき1つだけにする。静的メッシュもすべて結合して1つにするのが望ましい。
アバター内に隠している静的なメッシュは、適当なボーンにウェイトを割り振って、スキンドメッシュレンダラーでレンダリングしたほうがいい。静的メッシュレンダラーを使わないことでドローコールを削減できる。
メッシュにアクセサリー等を追加したら、メッシュ・マテリアル・テクスチャの結合を行う。そうしないとドローコールがその分だけ増加する。
アバターのポリゴン数は 10 万ポリゴンを超えるのでない限り、気にする必要はない。ただしアバターパフォーマンスランクが3万2千または7万ポリゴンをラインにしているので、たいていはそれ以下のポリゴン数が目標になる。
Skinned Mesh Renderer の Quality を1 Bone や2 Bone にすると、頂点が影響を受けるボーン数が少なくなるのでパフォーマンスがあがる。これは、ボーンのウェイトを適切に設定している場合のみ機能する。
メッシュ結合ツール
Skinned Mesh Combiner MT($14.19)
Unity 上で Skinned Mesh を結合する。
Cats Blender Plugin
Blender アドオン。Fix Model でメッシュが結合できる。
マテリアル
マテリアルの数に比例してドローコールが発生する。マテリアルは可能ならば1つにまとめる。Unity Asset の Mesh Baker が便利。
アルファブレンドマテリアルとそうでないマテリアルはまとめてはならない。そうすると全身アルファブレンドマテリアルになり、とても高負荷なアバターになってしまう。
テクスチャ
適切な圧縮オプションを選択する
通常は RGB Compressed DXT1(圧縮率1/6)、法線など高い品質が要求されるなら RGB(A) Compressed BC7(圧縮率1/3)を使う。圧縮フォーマットのテクスチャは VRAM にそのままロードされるため、VRAM 使用量の削減にもなる。
Crunch 圧縮は実行時に CPU で DXT か ETC に解凍され、画質が劣化する。テクスチャサイズが小さくなることでダウンロード時間が短縮されるため、ワールド用のテクスチャによく適用される。
外部リンク
DirectX 11の圧縮フォーマットBC1~BC7について(前編)
DirectX 11の圧縮フォーマットBC1~BC7について(後編)
サイズ
テクスチャサイズを小さくする。アバターのテクスチャサイズは 2048 pxで十分なことが多い。
小さいテクスチャは、巨大テクスチャ1枚にまとめる。
テクスチャは正方形かつ2の冪乗(128, 256, 512, 1024, 2048, 4096, 8192)にする。それ以外のサイズでは VRAM に無駄が発生する。
パーティクル
透過パーティクルとライトパーティクルとはパフォーマンスの点から見れば最悪だ。
最適化
- スプライトパーティクルを dynamic batching でレンダリングする
- コリジョンを使わない
- パーティクルの動きを単純化する
- パーティクルの数を減らす
シェーダ
負荷の軽いシェーダを使う
Unity の standard shader か Unlit か以下のコミュニティ発のシェーダーを使う。
Xiexe's "XSToon" Unity Shaders (GNU GPUv3)
NoeNoe's Shaders (Creative Commons 4.0)
lilToon も影や反射や屈折などの重いエフェクトを切れば低負荷で使える。
シェーダパスを減らす
シェーダパスはドローコールが増える。生成されるシェーダも増える。
アルファブレンド(半透明)を使わない
アルファブレンド(半透明)マテリアルは描画負荷が高いため、可能な限り使わない。
なぜ描画負荷が高いかというと、アルファブレンドマテリアルは全ポリゴン描画される上に、ブレンドが必要だからだ。不透明ポリゴンは裏面になっている場合は描画されない(設定で描画するようにもできる)。たいていのメッシュの半分は裏面なので、不透明メッシュで描画される実際のポリゴン数は半分程度だ。
透過
アルファブレンド程ではないが透過も負荷が高めだ。ポリゴン数を増やすことで透過を避けられるならそちらを推奨する。どうしても透過が必要な場合は Cutout を使う。Cutout は閾値を超えたピクセルのみを透過するモードで、ブレンドはできず、透過するかしないかしか選択できない。これは比較的負荷が軽い。
ポリゴンの分割数を増やして、透過部分を可能な限り少なくすることでパフォーマンスを上げられる。Blender ならLogo Tracer($0+)アドオンで透過 PNG をメッシュに変換できる。
高品質な変換が必要なら Inkscape のビットマップトレースを使って SVG に変換したあと、その SVG を Blender にインポートしてメッシュに変換する。
シェーダーキーワードの使用を避ける
シェーダーキーワードを使用すると、その組み合わせの数だけシェーダーが作成される可能性がある。シェーダーキーワードが 10 個あるシェーダファイル1つから、最大で 512 のシェーダが作成される。
ライト
アバターにライトを配置しない。使うなら影を切って使う。Forward レンダリングのライトがパフォーマンスに与える悪影響はマテリアルの比ではない。
Forward レンダリングの場合、メッシュは影響を受ける光源の数だけレンダリングされる。ドローコール数 100 のアバターが3つの光源の影響を受ける場合、ドローコール数は 300 になる。
ワールドについて
ワールド内に影を作成するライトは1つだけにするのが望ましい。
AO 等の間接光はすべてテクスチャにベイクする。
PC 版アバターパフォーマンスランク
Avator Performance Ranking System#PC Limits
パフォーマンスランクは良い順に Excellent, Good, Medium, Poor となっている。
ダイナミックボーン時代はダイナミックボーンコライダーを使用すると Medium 以下が確定するため、Medium をターゲットにモデルを作成することが多かった。PhysBones は Excellent でも使用でき、Good でも PhysBones の影響を受けるトランスフォームの数が 64 ある。なので PhysBones を使うなら、可能なら Excellent、ポリゴン数を盛ったりパーティクルを使ったりするなら Good がターゲットになるだろう。
Excellent
ポリゴン数の上限は 32,000。物理系やパーティクルが使えないが PhysBones は使える。
1メッシュ、1マテリアルで、ポリゴン数を 10,000 に抑えると、PC での Excellent は Quest では Good になる。
PhysBones の制限
要素 | 制限 |
---|---|
PhysBones コンポーネント | 4 |
PhysBones の影響を受けるトランスフォームの数 | 16 |
PhysBones コライダーの数 | 4 |
PhysBones コリジョンチェックカウント | 32 |
使えないコンポーネント
以下は使えないコンポーネントの一部だ。
- ダイナミックボーン
- パーティクル
- クロス
- Physics Colliders
- Physics Rigidbodies
- ライト
Good
ポリゴン数の上限は 70,000。ダイナミックボーンは使えるが、ダイナミックボーンコライダーは使用できない。ダイナミックボーンコンポーネントは4個まで、ダイナミックボーンの影響を受けるボーン数は 16 が上限。
PhysBones の制限
要素 | 制限 |
---|---|
PhysBones コンポーネント | 8 |
PhysBones の影響を受けるトランスフォームの数 | 64 |
PhysBones コライダーの数 | 8 |
PhysBones コリジョンチェックカウント | 128 |
Medium
ポリゴン数の上限は 70,000。ダイナミックボーンコンポーネントは 16 個まで、ダイナミックボーンの影響を受けるボーン数は 32 が上限。ダイナミックボーンコライダーが4つまで使える。
ダイナミックボーンコリジョンチェックカウント(すべてのダイナミックボーンスクリプトの Colliders の合計数)の上限は8。ダイナミックボーンコンポーネントを多数使用している場合、この制限に引っかかる可能性がある。
PhysBones の制限
要素 | 制限 |
---|---|
PhysBones コンポーネント | 16 |
PhysBones の影響を受けるトランスフォームの数 | 128 |
PhysBones コライダーの数 | 16 |
PhysBones コリジョンチェックカウント | 256 |
Quest 版アバターパフォーマンスランク
Avator Performance Ranking System#Quest Limits
Quest 版の注意点は Excellent と Good のマテリアルスロットの数がひとつしかないところだ。ここでアルファブレンドマテリアルを使ってしまうと、Excellent なのに描画負荷が重いアバターになってしまう。
Excellent は厳しく、ポリゴン数は 7,500 以下で PhysBones も使えない。
外部リンク
Unityでドローコール(Set pass call)を減らす方法まとめ
UnityのBuild Report Inspectorでビルドレポートをさくっと確認する
VRChatのパフォーマンスランクについてまとめる(VRChat 2018.4.4)
23万ポリという数字自体に囚われるのは良くない――かといって重くないわけでもないという話
Unity ツール
Avatar Optimizer
【Avatar Optimizer】できる範囲でやるアバター最適化
キセテネ
VRC/3Dアバター向け簡単着せ替えツール。
AvatarTools
メッシュやボーンの結合ツール。
LazyOptimiser
VRC公式の最適化ツール。2022 年7月現在、開発中。実装されている機能は以下の3つ。
- 未使用のゲームオブジェクト削除
- 未使用のブレンドシェイプ削除
- メッシュの結合機能(ただし不安定)
VRCQuestTools
複製したアバターを Quest 対応させるツール。
Skinned Mesh Combiner MT($18.59)
Skinned Mesh を結合するツール。
Mesh Optimizer
メッシュのポリゴンを削減するツール。Skinnded Mesh は非対応。
解説記事。