アバター最適化
現在はAvatar Performance Ranking Systemというものが公式で実装され、一つの目安となっています。
Avatar Performance Ranking System
Avatar Performance Ranking Systemはアバターの特定の要素ごとにランクを規定し、負荷の目安を提示するシステム。ポリゴン数を除き、ランクによるアップロード制限はない。
以下に、代表的な項目と具体的な軽量化の方法を示す。
ただし、多くの場合は軽量化と表現の精細化はトレードオフであり、一概にどちらが優れているというものではないということを一応書いておく。
Polygons
ポリゴン数。頂点数ではなく、三角の数で計算する。
アバターをアップロードする際は、70,000ポリゴン以下に収める必要がある。
頂点を削除する際、シェイプキーを持ったメッシュの頂点を削除するとシェイプキーが破損することがあるので注意。
※VRChat 2019.2.4 (build 801)から非表示オブジェクトもポリゴン制限に含まれるようになりました
Bounds Size
Boundsのサイズ。スキンメッシュレンダラーのプロパティで、メッシュの境界を表す。アバターを完全に覆う範囲で最小にする。
Tips
- 複数のスキンメッシュがある場合はBoundsを統一することでメッシュが視界の端で部分的に非表示になるのを防ぐことができる。
- 複数のスキンメッシュのAnchor Overrideに同じものを設定することで、参照するLight Probe等を統一でき、メッシュごとの明るさの差異を小さくできる。
Skinned Meshes
スキンメッシュの数。以下の条件を満たす場合、Blender等でメッシュを結合することで数を減らせる。
- 同一のアーマチュア
- 同一階層
- スキンメッシュごとに表示/非表示、座標等の変更の必要がない
Meshes
スキンメッシュでないメッシュの数。スキンメッシュと結合し、追従させたいボーンのウェイトを1で塗ることでおおよそ同一の挙動で数を減らすことができる。
Unique Materials
マテリアルの種類。Texture atlasなどを作成してマテリアルを結合することで、同一シェーダのマテリアル同士を統合できる。
→Blenderでのマテリアル統合支援アドオン: MATERIAL COMBINER BLENDER ADDON (2.0.3.2)
Dynamic Bone Components
Dynamic Boneのコンポーネントの数。
Dynamic Boneは対象のBoneの子すべてに影響を与えることができるので、対象な位置にあるBoneなどは根元に親となるBoneをいれ、そこをDynamic Boneの対象とすることで数を減らすことができる
Dynamic Bone Transforms
Dynamic Boneの影響を受けるTransformの数。対象Boneが接続されてない(Boneの端同士の座標が離れている)場合、Boneの両端がカウントされる。
Dynamic Bone Colliders
Dynamic Bone Colliderの数。
Dynamic Bone Collision Check Count
Dynamic Bone Colliderの影響を受けるDynamic Bone Transformsの数?
Animators
Animatorの数。アップロード時に最上層に追加されるため、最低数は1になる。
Bones
Boneの数。
Lights
ライトコンポーネントの数。
リアルタイムライトは高負荷になりやすいため、ワールド内を照らす等の目的がない場合はテクスチャに焼いたり、Emissionを持つシェーダなどで代用すると軽量化が見込める。
Particle Systems
パーティクルシステムのコンポーネントの数。
高負荷なパーティクルの多くはシェーダに問題があることが多いので、軽量化を目的とする場合は先にシェーダ周辺を検討することをおすすめする。
Total Particles Active
パーティクルの出現上限の合計。
Mesh Particle Active Polys
メッシュパーティクルのポリゴン数。パーティクルの数の上限×パーティクルのポリゴン数。
Particle Trails Enabled
トレイルが有効なパーティクルの数。
Particle Collision Enabled
コリジョンが有効なパーティクルの数。
Trail Renderers
トレイルレンダラーの数
Line Renderers
ラインレンダラーの数
Cloths
クロスコンポーネントの数。
Total Cloth Vertices
すべてのクロスのポリゴン数の合計。
Physics Colliders
Physics Rigidbodies
Audio Sources
オーディオソースの数。アバターのオーディオ関連のコンポーネントはアップロード時にパラメータの一部が修正されることがあるので注意する。
Tips
ドローコール数を減らすと負荷の軽減につながるという話
- https://twitter.com/skknyuki/status/983579460296323077
- Gameタブの右上、Statsをクリック、GraphicsにあるBatchesの項目で確認できる
- 適切な数値は不明だが、マテリアル数、テクスチャ数、メッシュ数、シェーダーに応じて増減する
- 例1-A:mikoko:メッシュx28、テクスチャx1、マテリアルx1、CubedParadox/FlatLitToon=115
- 例1-B:mikoko:メッシュx28、テクスチャx1、マテリアルx1、Unlit/Texture=31
- 例2-A:人型:メッシュx8、テクスチャx1、マテリアルx1、CubedParadox/FlatLitToon=31
- 例2-B:人型:メッシュx8、テクスチャx1、マテリアルx1、Unlit/Texture=10
- 例3-A:ボクセル:メッシュx3、テクスチャx1、マテリアルx1、CubedParadox/FlatLitToon=15
- 例3-B:ボクセル:メッシュx3、テクスチャx1、マテリアルx1、Unlit/Texture=6
- StandardはCubedParadox/FlatLitToonよりほんの少しBatchesが多い
- ドローコール数は描画機能の呼び出し回数。
- この描画機能の実行時には CPU と GPU がデータのやり取りを行うので、回数が多いと並列動作が妨げられて動作が遅くなる原因になる。
- Blenderでマテリアルスロットとメッシュを減らす方法
- マテリアルを結合してドローコールを減らすための BlenderのAddon
- 参考:Unity マニュアル
「アバターが重くなる原因」と「解決策」そして「妥協案」
軽量化に関する考察
- https://twitter.com/gend_VRchat/status/985385967774154753
- https://twitter.com/gend_VRchat/status/985389460069036032
- https://twitter.com/gend_VRchat/status/985394604747907072
参考:アバターの負荷に関係する公式への要望ピックアップ
- 負荷の要因について述べられているので参考になる。総じてCPU負荷を軽くするのが肝要とのこと。
- https://vrchat.canny.io/feature-requests/p/rewarding-avatars-that-use-optimization
- https://vrchat.canny.io/feature-requests/p/sdk-build-time-optimization-notifications
- https://vrchat.canny.io/feature-requests/p/turn-off-and-on-particle-and-dynamic-bone-vrchat-setting-menu
- https://vrchat.canny.io/feature-requests/p/limit-skinned-mesh-renderers-on-avatars
大部分はアバターパフォーマンスランキングシステムやセーフティシステムという形で実装されました。
リンク
- Avatar Optimization Tips
- What is optimization, and why is it important?
- チュートリアル動画あり
- Blenderで複数オブジェクトの同時UV展開を行う(Texture Atlasアドオン)
- Blender のアドオン Texture Atlas の解説
- CATS BLENDER PLUGIN (0.11.2)
- Blender用VRChat向けアバター最適化総合支援Plugin →Cats Blender Plugin
- MATERIAL COMBINER BLENDER ADDON (2.0.3.2)
- Blender用マテリアル統合支援アドオン →material-combiner-addon
- Simplygon https://www.simplygon.com/
- ポリゴン削減ツール → Simplygon
- 最終更新:2020-08-08 09:40:54