広告
広告

VRChat アバター最適化メモ

カテゴリ:unity

よくあるケース

過剰ダイナミックボーン

全身アルファブレンドマテリアル

メッシュ・マテリアルが結合されていない

目次

ボトルネックの特定

CPU

GPU

外部リンク

ボトルネックの特定

タスクマネージャを見る。

確実な方法ではないが、レンダリング解像度を下げてフレームレートが向上すれば、GPU がボトルネックになっている。フレームレートが変化しなければ CPU がボトルネックになっている。

Shiftキーを押しながらVRChatを起動すると表示される起動オプションから、レンダリング解像度を変更できる。

詳細な測定にはプロファイラを使う。

Profilerの使い方と最適化の目安の付け方(前編)【Unity】【Unite 2017 Tokyo】【最適化】

CPU

ドローコールとは

ドローコールは1フレームの間に GPU に送られた描画命令の数で、この数が少ないほど効率的にレンダリングできる。ドローコールが多いと CPU と GPU 両方に余計な負荷がかかる。Stats の Batches: でドローコール数が確認できる。

What is the cost of changing state?

ボーン

ダイナミックボーン

VRChat では、ダイナミックボーンを適用するボーンの数を 30 以下にすることが推奨されている。

ダイナミックボーンのコライダーの使用も非推奨となっている。ボーンとコリジョンとの衝突判定を総当たりで計算する非効率的なアルゴリズムのため。

グラビティを切る。

補助ボーン等

Humanoid を動かすのに不要なボーンは可能な限り削除する。

クロス

200 頂点以上のメッシュにクロスをつけるのは非推奨ダイナミックボーンと同じ計算コストの問題があるため。

GPU

メッシュ

メッシュのレンダラーは2種類ある。動かないメッシュをレンダリングする静的メッシュレンダラーと、ボーンで変形させるメッシュをレンダリングするスキンドメッシュレンダラーとだ。スキンドメッシュレンダラーは負荷が高いので、1アバターにつき1つだけにする。静的メッシュもすべて結合して1つにするのが望ましい。

アバター内に隠している静的なメッシュは、適当なボーンにウェイトを割り振って、スキンドメッシュレンダラーでレンダリングしたほうがいい。静的メッシュレンダラーを使わないことでドローコールを削減できる。

メッシュにアクセサリー等を追加したら、メッシュ・マテリアル・テクスチャの結合を行う。そうしないとドローコールがその分だけ増加する。

アバターのポリゴン数は 10 万ポリゴンを超えるのでない限り、気にする必要はない。

メッシュの結合には Cats Blender Plugin の 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 か以下のコミュニティ発のシェーダーを使う。

Cubed's Shaders (MIT)

Xiexe's "XSToon" Unity Shaders (GNU GPUv3)

NoeNoe's Shaders (Creative Commons 4.0)

シェーダパスを減らす

シェーダパスはドローコールが増える。生成されるシェーダも増える。

アルファブレンド(半透明)を使わない

アルファブレンド(半透明)マテリアルは描画負荷が高いため、可能な限り使わない。

透過

アルファブレンド程ではないが透過も負荷が高めだ。ポリゴン数を増やすことで透過を避けられるならそちらを推奨する。どうしても透過が必要な場合は Cutout を使う。Cutout は閾値を超えたピクセルのみを透過するモードで、ブレンドはできず、透過するかしないかしか選択できない。これは比較的負荷が軽い。

ポリゴンの分割数を増やして、透過部分を可能な限り少なくすることでパフォーマンスを上げられる。

シェーダーキーワードの使用を避ける

シェーダーキーワードを使用すると、その組み合わせの数だけシェーダーが作成される可能性がある。シェーダーキーワードが 10 個あるシェーダファイル1つから、最大で 512 のシェーダが作成される。

ライト

アバターにライトを配置しない。使うなら影を切って使う。Forward レンダリングのライトがパフォーマンスに与える悪影響はマテリアルの比ではない。

Forward レンダリングの場合、メッシュは影響を受ける光源の数だけレンダリングされる。ドローコール数 100 のアバターが3つの光源の影響を受ける場合、ドローコール数は 300 になる。

ワールドについて

ワールド内に影を作成するライトは1つだけにするのが望ましい。

AO 等の間接光はすべてテクスチャにベイクする。

アバターの最適化チェックリスト

Unityでドローコール(Set pass call)を減らす方法まとめ

VRChatアバター最適化のTips [日本語訳]

アバター/ワールドの最適化

アバター最適化

UnityのBuild Report Inspectorでビルドレポートをさくっと確認する

Blender アドオン

Cats Blender Plugin

material-combiner-addon

Pumkin's Avatar Tools


広告
広告