0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VRChatのアバターを軽量化したい方へ。

Last updated at Posted at 2025-05-21

はじめに

パブリックインスタンスに行くこと、楽しいですよね。

知らない人と話したり、フレンドになったり。

私も暇だったら結構パブリックに行ったりしています。

しかし、やっぱり...

みんな、アバターが重い!重すぎる!

image.png

そこまで低スペックでもないのに、FUJIYAMAとか行くとFPSが20になったり...

なぜみんな重いのかと考えると、やはり情報が不足しているような気がしてきたので、この記事を書きました。

それでは、軽量化してみましょう。

まずはインポートから

VCCからインポートできるやつ

ツール名 作者
AAO: Avatar Optimizer anatawa12
lillNDMFMeshSimplifier (NDMF) lilxyzw

ダウンロードして入れるやつ (VCCからもインポート可能)

ツール名 作者 ダウンロードリンク
VRC Avatar Performance Tools Thryrallo GitHub リンク
TexTransTool Reina_Sakiria Booth リンク
ActualPerformanceWindow anatawa12 Gist リンク

各ツールを使う目的は以下のような感じです。

ツール名 目的
AAO: Avatar Optimizer Mesh結合やPhysBoneの最適化
lillNDMFMeshSimplifier (NDMF) Polygonの軽量化
VRC Avatar Performance Tools Texture Memoryの軽減
TexTransTool Textureの結合
ActualPerformanceWindow AvatarPerformence Rankの確認のため

インポートし終わったら準備完了です!

image.png

今回の軽量化は、しなのちゃんが手伝ってくれました。

image.png

何も施していないしなのちゃんのPerformence Rankはこのような感じです。

Polygonsは14万、Texture Memoryが63MBといった具合ですね。軽くも、重くもないです。

このしなのちゃんをMediumにしていきたいと思います!

まずは軽量化の順番について。正直順番は関係ないので、好きな順番で行っても大丈夫です。

  1. VRC Avatar Performance ToolsでTexture Memoryを減らす

  2. TexTransToolでMaterialを結合させる

  3. NDMFでPolygonの軽量化をする

  4. AAOでMeshの結合、PhysBoneの軽量化などをしていく

という感じです。

それでは、このしなのちゃんを軽量化していきましょう!

1. VRC Avatar Performance ToolsでTexture Memoryを減らす

image.png

Texture Memoryはこのアバターが使うと予想されるRAM/VRAMのサイズです。

最近、アバターのダウンロードサイズを100MB以下にすればいいという話が出回っていますが、これは事実ではありません。容量だけの話であれば、

実際のパフォーマンスに影響するのはダウンロードサイズではなく、このTexture Memoryが大きく影響を与えます

減らしましょう。AvatarPerformence Rankでは、Texture Memoryが150MB以下であればPoor判定になりますが、私は75MB以下になるようにするのが理想的だと思っています。

image.png

VRC Avatar Performance Toolsの画面です。

ここで、Texture Memoryの軽減ができます。
まず、以下の内容を覚えておいてください。

  • 4096(4k)の画質を使うのは避けましょう。
  • CrunchedはTexture Memoryが減っているように見えても、実際にプレイする時はメモリ上で展開されるので、意味がありません。

画質は1024か2048になるようにしていきましょう。

MatcapやMaskなどは512か256にしてもそれほど目立ちません。

可逆的な作業なので、色々な画質を試しながら減らしていきましょう。

image.png

Texture Memoryの軽減が終わった後のしなのちゃんです。

63.60MBから9.10MB、かなり軽くなりました。

次に進みましょう。

2. TexTransToolでMaterialを結合させる。

TexTransToolは、Materialの結合以外にも様々な機能を提供しています。ただ今回は、Materialを結合する機能だけに集中します。

image.png

まず、HierarchyからEmpty Objectを一つ生成します。名前は自由に設定してください。(ただし、この作業はEmpty Objectでなくても問題ありません。)

image.png

その後、InspectorAdd ComponentからTTT AtltasTextureを追加してください。

image.png

Inspectorでは上記のような画面になります。

  • 結合対象のMaterial : チェックを入れたMaterialが結合されます。
  • 基準Material : 基準となるMaterialです。結合後のShaderの設定(影、Rimlight、Outlineなど)は、このマテリアルを基準として設定されます。必ずプレビューで確認しながら作業してください。
  • 結合テクスチャの画質 : 結合されたMaterialのテクスチャの画質です。

ここで、結合させたいMaterialを選択し、結合することができます。
結合においては、いくつか注意すべきポイントがあります。必ずお読みください。

注意!

  • AlphaTransparencyが消失します。半透明の設定がある場合、結合対象から除外してください。
  • 同様の理由で、顔の表情などのテクスチャの結合は避けてください。
  • 服と体の影の設定が異なる場合があります。注意してください。
  • 結合たいしょうが違うShaderである場合、結合対象のMaterialのShaderに上書きされます。注意してください。

image.png

今回は、服/髪と顔/体を分けて設定しました。
これで、Material(Texture)の結合が終わりました。

3. NDMFでPolygonの軽量化をする。

Polygonの軽量化にはVCCからインポートできるNDMFを使います。

image.png

軽量化させたいObjectを選択し、Add ComponentからNDMF Mesh Simplifierを追加してください。

image.png

その後の使い方は非常に簡単で、qualityの数値を変更することで軽減ができます。Sceneにリアルタイム反映されるので、確認しながら数値を変更してください。

ただし、NDMFもTTTと同様に、顔に使用するのは避けてください。表情のComponentsである、シイタケなどは非常に単純なPolygonとなっていますので、軽量化させると壊れてしまいます。


3までの作業を終えた後のしなのちゃんです。

image.png

Polygonsが140034から66579になりました。かなり軽くなりましたね。

AvatarPerformence Rankでは、Polygonsが70000以下であればGood判定をもらえます(32000以下であれば Very Good)。70000以上からはVery Poorになりますので、参考にしてください。

4. AAOでMeshの結合、PhysBoneの軽量化などをしていく。

いよいよAAOの出番です。馴染みのある方も多いでしょう。

まずはMeshの結合から始めましょう。

4.1 AAO Mergy SkinnedMesh

AAO Mergy SkinnedMeshでは、Skinned Mesh RendererMesh Filterの結合ができます。

まず、HierarchyからEmpty Obejectを生成し、好きな名前にしてください。

image.png

その後、Add ComponentからAAO Mergy SkinnedMeshを追加してください。

image.png

すると、以下のような画面が追加されます。

image.png

スキンメッシュレンダラーSkinned Mesh Renderを、静的レンダラーにはMesh Filterを入れてください。

image.png

今回はMesh Filterが対象のObjectではないので、Skinned Mesh Renderのみとなります。

ただ、結合において、いくつか注意すべきポイントがあります。必ずお読みください。

  • ON/OFFしたいObjectやギミックは結合から除外してください。Meshが一つになってしまうので、ON/OFF機能が正常に作動しない場合があります。(今回はAFKの時に出てくるソファは除外しました。)
  • BlendShapesが壊れたり、正常に作動しない場合があります。固定させたいBlendShapesがある場合、AAO FreezeShapesで固定しておいてください。

また、AAO Remove Mesh by Boxという機能があります。

スクリーンショット 2025-05-21 175559.png

この機能は赤いBoxを設定して、そのBox内にあるMeshを削除してくれます。
目に見えない部分を消しておきたい方はぜひ試してみてください。


image.png

4.1まで終えた後のしなのちゃんです。Physbone以外は全てGoodになりました。

Skinned Meshesも一つになり、Excellentになっています。

PolygonsはAAO Remove Mesh By Boxの導入により、さらに軽減されました。


4.2 AAOによるPhysbone軽量化

4.2では、経験的にBoneやPhysboneを削減していく必要があります。目立たないBone、使用しないBoneなどを思い切って削除する必要があります。

しなのちゃんの場合は、お尻(Butt.L / Butt.R)のPhysBoneの削除、服の盆の削減などがその対象です。

これまで色々なアバターを軽量化し、Goodにしてきましたが、最も削減が難しいのはPhysboneでした。

言い訳に聞こえるかもしれませんが、アバターによって異なる部分も多く、「こうしてください」というような汎用性のある説明をするのが非常に難しいです。

したがって、ここではAAOの機能の説明のみを記述します。

4.2.1 AAO Merge PhysBone

Physboneの結合/軽量化にはAAO Merge PhysBoneを使用します。

image.png

使い方は非常に簡単で、コンポーネントにPhysBoneを入れていけば終わりです。

入れられるBoneの条件としては、

  • VRC PhysBoneのComponentsの内容が同じであること。
  • Root Transformがある場合、同じRoot Transformを参照していること。
  • 同じBoneに位置していること。

です。別のBoneに位置しているPhysBoneは結合できません。
注意点としては、以下のように髪の毛の全てのBoneをその対象とした場合、

image.png

Physboneが一体化されますので、同時に一つのBoneにしか触ったり(Grab)、固定したり(Posing)することができなくなります。

4.2.2 AAO Merge Bone

AAO Merge Boneは使用していないBoneを削る時に使用できます。

image.png

説明の通りの感じで、AAO Merge Boneが導入されているBoneをそのChild(下位Bone)を削除し、親に結合させます。


image.png

image.png

ここまでの作業でしなのちゃんがMediumになりました。

正直、Goodにしたかったのですが、見た目がそこまで変わらないレベルであれば、自分ではMediumが限界でした。

比較してみるとこんな感じになります。

image.png

5. その他

5.1 リアル影システムや、懐中電灯などを入れている場合、常時ONは避けましょう。

光源(Light)はVRChatにおいて、最もパフォーマンスに影響を与える要素の一つです。
簡単に説明すると、Realtime Lightは非常に重いです。

VRChatはForward Renderingというレンダリングによりレンダーされ、このレンダリングは $n × m$の演算を行います。ここで$ n $は光源の数、$ m $は光源の影響を受ける物体のVertex数になります。

光源が存在していない場合、$ m $だけの演算になりますが、一つでもRealtime Lightが存在していると、その演算量が爆発的に増加します。

13万ポリゴンのアバターがあるとし、ワールドに光源が2個、リアル影システムが1個あるとしたら、$ 3 × 130,000 $として、膨大な演算が必要になります。

また、これにより影も計算する必要が生じます。これにより、計算量は膨大に増加し、ラグの原因となります。

これはアバターだけでなく、ワールドにも影響を与えますので「重くなる」というのは言うまでもないと思います。

少し長くなりましたが、言いたいことは一つ。

リアル影システムやリアルタイム光源の導入はなるべく避けてほしいと思います。

5.2 服を複数枚入れるのも避けましょう。

服を複数入れるのは、便利ですよね。ただ、本当に重くなります。避けましょう。アバターを分離してアップロードしましょう。

どうしても入れたい場合は、Animationの作成の時にその服のBoneやPhysBone Componentsまでオフにしてください。

5.3 Particle Systemを減らしましょう。

近年、Particle Systemを活用したアバターギミックは多数存在しています。しかし、Particle Systemもかなり重いです。減らしましょう。ぴかぴかしていてきれいなギミックは素敵ですが、なるべく避けてください。パブリックで使用するのも避けてください。ラグの原因となります。

5.4 Bounds範囲を調整しましょう。

image.png

VRChatには遠いアバターは見えないように設定する機能があります。ラグの軽減のために使っている方も多いでしょう。しかし、せっかくその範囲を決めていてもBounds範囲が広いと、意味がなくなります。他人のために減らしましょう。ラグの原因となります。

5.5 複雑なAnimatorの使用は避けましょう。

image.png

VRChatはAnimatorの使用ができます。

image.png

AnimatorのLayerは順番に実行され、Layerが多いとCPUでの演算量が増加します。LayerのWeightが0でも計算されます。LayerとLayer内のStateはなるべく複雑にならないようにしていきましょう。

最後に

これで、AAO/Thryrallo/TTTなどのツールを使用したVRChatのアバターの基本的な軽量化の説明が終わりました。

アバターの軽量化は、自分自身のためだけでなく、他人のためにも必ず行っておく必要があります。

Very Poorだから「重い」というわけでもありません。できる範囲内で、軽量化していきましょう。
必ずGoodかMediumにする必要もありません。できる範囲内で、軽量化していきましょう。

自分のためにも、みんなのためにも軽量化はしていきましょう。

最適なVRChatライフのために。

最後まで読んでいただきありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?