一年中こたつ出てる

こたつは最高

【Avatar Optimizer】できる範囲でやるアバター最適化

VRChatを始めてから早いもので8ヶ月が経ちました。

Avatar Optimizerが普及するにつれ、最適化やらないといけないなと思ってるんだけどどうやればいいのかよくわかんなくて…という声を聞く機会が徐々に増えてきた気がします。

自分の中でのアバター最適化で気をつけてるポイントとやってることがだいたい固まってきたので、参考になればと思いまとめてみます。

Blenderを使うなどしてもっとやれることはありますが、Unity上で簡単にできる範囲でしかやっていません。
継続して取り組めないとつらいので…。

※執筆時点のバージョン

  • VRC SDK:3.4.1
  • lilAvatarUtils:1.0.3
  • liltoon:1.5.0
  • Avatar Optimizer:1.6.4

パフォーマンスランクで気をつけるポイント

皆さんご存知だと思いますが、VRChatにおいてはパフォーマンスランクというものがあります。

creators.vrchat.com

この中でも個人的に気にしてる指標としては以下があります(2023年12月現在)。

  • Texture Memory
  • Skinned Meshes
  • Material Slots
  • PhysBones Components
  • Bones

なぜこれらの指標を気にしているかというと、CPUやGPUに負荷をかける主な原因となり、かつ簡単に改善することができるためです。

この中でも特にTexture MemoryはGPUのVRAMの使用率に直結します。 VRAMが枯渇した場合、FPSが著しく低下し、最悪の場合VRChat自体が落ちるなどします。
アバターの表示数を減らしたとしても現在のVRChatの仕様上VRAM上にロードされるため対処することが難しく、対処方法としてはよりVRAMを積んだ強いGPUに買い替える or 人が多いワールドにいかないくらいしか方法がありません。
VRChatにおいて、VRAMが非常に重要であるというのはちもろぐさんの検証からも確認できます。

chimolog.co

これらの指標はこれから記述するポイントをやっていくことで、比較的簡単にPoor以下に持っていくことができます。

ポリゴン等でVery Poorのままだったとしても、実際の負荷を確実に下げることができるため、やらないよりはやったほうが周りのフレンドや関わる方々のためになります。

何やってもどうせVery Poorだからな~ってなったとしても、必ずTexture Memoryだけは気にするようにしています。

Texture Memoryは150MB死守を目標にして、それ以外はまぁ減ればいいか、位の感覚でやっています。

基本編

ボーンを統合できるツールで衣装を着せる

Modular AvatarやAvatarToolsなど、衣装のボーンをアバター側に統合できるツールで衣装を着せることで、ボーン数を減らすことができます。

modular-avatar.nadena.dev

Modular Avatarを使った衣装着せ替えについては以前まとめたものがありますので、よかったら参考にしてみてください。

kxn4t.hatenablog.com

1アバター1衣装

1アバター1衣装とするだけでテクスチャメモリやボーン、PBなどの負荷を下げることができます。

昔は複数衣装を入れてるのが当たり前だったらしいですが、その時代を自分は知らないので自分は全部1アバター1衣装です。

なんならアニメーションを組むのがめんどくさくって衣装の色違いやパーツ違いのアバターがあったりします…(これは単にめんどくさがり)。

使わないメッシュはEditorOnlyにする

使わないメッシュをDisabledにするだけだとアップロードされちゃいます。
EditorOnlyにすることでVRChat上にアップロードするときに含まれなくなります。

後述するAvatar OptimizerにてDisabledするだけで消せるのは消せるんですが、アバター素体側の服などは明示的に消すのがいいかなと思っています。

アバター自体に服の切り替えアニメーションが組み込まれていることが多く、FXレイヤーにて参照されているままだとAvatar Optimizerでは消されないためです。

lilAvatarUtils編

lilAvatarUtilsは、アバターに含まれるテクスチャやマテリアルなどの一覧表示、セーフティー発動時の見た目の確認、アバターに含まれる余計なアセットやプロパティの削除などができる大変便利なツールです。

github.com

ここではポイントを絞って説明するため、より詳しい内容が知りたい方はlilさんの記事を参考にしてください。

qiita.com

インストール方法

VPMリポジトリを追加する

(liltoonをVCC経由でインストールしている場合はすでに追加されているので不要です)

こちらのページを開き、

github.com

このリンクをクリックしてリポジトリに追加します。

プロジェクトに追加する

ProjectsのManage Projectから追加します。

余談ですが、VPMリポジトリがあるのであれば、liltoonなどこういったツール群はVPMリポジトリ経由でVCCで管理・インストールするようにしましょう。

テクスチャの解像度を下げる

アバター最適化において、一番やっておきたいことです。
テスクチャの解像度を下げることでテクスチャメモリを減らすことができ、アバターのダウンロードサイズも小さくなります。

lilAvatarUtilsを使ってテクスチャメモリを減らしていきましょう。

lilAvatarUtilsは[Window]→[ _lil]→[AvatarUtils]から開くことができます。

ジンゴさんのマヌカちゃんを見てみましょう。

何もしていない場合のテクスチャメモリは40MBみたいです。

解像度を変更したいテクスチャのMax Resolutionの値を変更して、

Applyをクリックすれば変更できます。

こんな感じでテクスチャサイズを変更していきます。

4Kテクスチャは不要で全部2K以下でいいという人もいますが、自分の場合は要所要所で4Kテクスチャも使いつつ自分の納得できる落とし所を見つけています。

小さくしたらグラデーションなどが気になる場合、QualityをHigh Qualityにしてみると良くなったりします。
ただし、ビルド時の圧縮が効きにくくなるので、ダウンロードサイズが大きくなることがあります。

また、Matcapやマスク用のテクスチャは小さくしても問題がない場合が多いです。

マスクのテクスチャを小さくするとエッジが気になる場合、kb10uyさんのlilToon_MsdfMaskを使うことで小さなテクスチャでも綺麗にエッジを出すことができるので紹介しておきます。

kb10uy.org

解像度を下げても容量が減らないとき

解像度を下げても容量が減らないときはフォーマットがAutomaticになっていないかもしれません。

テクスチャを選択し、InspectorからFormatをAutomaticに変更しましょう。

それでも減らない、サイズが変わらないときはPC用の設定でオーバーライドされているかもしれません。

PCのタブを選択し、オーバーライドのチェックを外しましょう。

使ってないテクスチャが残ってないかチェック

一覧で見ているとたまに色が違うテクスチャが残ってたりすることがあります。
色のバリエーションが複数用意されているマテリアルの輪郭線とかで残りがちです。

同じ色のテクスチャにしてあげるなどして、不要なテクスチャは取り除きましょう。

(番外編)明るさがアバターと衣装で合ってるかチェック

アバター最適化とはちょっと違うかもですが、lilAvatarUtilsのLightingタブからアバターと衣装の明るさが合ってるかどうかも確認できます。

おかしい場合、liltoonの場合は[ライティング・明るさ設定]のところを素体側と合わせましょう。
該当のマテリアルの明るさの下限と上限を揃えるとよいです。

別のツールにはなりますが、Light Limit Changer for MAを使うことで明るさを一律で揃えることができます。

Light Limit Changer for MAは非破壊でビルド時に明るさを揃えてくれるため、Prefab Variantのルートに適用しておけば明るさのチェックを毎回する必要がなくなります。

azukimochi.github.io

Exメニューからアバターの明るさを変更できたりしてとても便利なので、こちらも合わせておすすめです。

Light Limit Changer for MAを使わない場合、liltoonではアバタールートのオブジェクトを右クリック→[liltoon]→[Fix lighting]とやるだけでも一律に揃えてくれます。

しかし、Bounds, Root Bone, Anchor Overrideも変更されてしまうので、これが気になる方は手でマテリアルの明るさを揃えるのがよいでしょう。

明るさを揃えるという観点では、Anchor Overrideについても揃える必要があるのですが、これについてはMA Mesh Settingsコンポーネントを使って揃えるのをおすすめしています。

【初心者向け全部盛り】Prefab Variantで管理しつつModular Avatarで衣装の着せ替えをやってみよう - 一年中こたつ出てる

私のおすすめとしては、

  • マテリアルの明るさを揃える
    • Light Limit Changer for MAで設定する
  • 明るさの基準(Bounds, Root Bone, Anchor Override)を揃える
    • MA Mesh Settingsをアバタールートに設定する

このようにすると、明るさについて悩むことがなくなるのでおすすめです。

(番外編)セーフティに引っかかってるときの見え方チェック

LightingタブのSafety Onにチェックを入れることでSafetyに引っかかってるときの見え方をチェックできます。

Transparentをつかっているときはだいたいおかしくなります。

Custom Safety Fallbackにチェックを入れましょう。

こちらのShader Typeなどの設定はこれに当たるものとなりますが、どれを設定するといいのか体系的にあるわけではなく、極論見た目が近いものを選ぶということになるみたいです。

creators.vrchat.com

とりあえずUnlitにしておけば表示されるようにはなりますが、Unlitはライティングの影響を受けないため、暗いところでも明るくなってしまいます。

自分もあまり詳しくないため、liltoonのこのシェーダータイプだとこの設定にするといい、みたいなものがあるのであれば教えていただけると嬉しいです。

Avatar Optimizer編

非破壊でアバターを最適化できるツールです。

このツールを使うことで簡単にアバターの最適化が実施でき、またメッシュの貫通とかもちょちょいと直せちゃうので、もう手放すことができないツールです。

インストール方法

VPMリポジトリ経由でインストールしましょう。

vpm.anatawa12.com

Actual Performance Window

Avatar Optimizerはビルド時に動作するため、SDKのパフォーマンスランクの表示が当てにならなくなります。

Actual Performance Windowに関しても同時に入れておくのをおすすめしています。

vpm.anatawa12.com

使われていないオブジェクトやボーンを削除する

Trace And Optimizeコンポーネントを使用することで、使われていないオブジェクトやボーンを自動で削除してくれます。
また、BlendShapeも固定・削除してくれるため見た目以上の軽量化を行ってくれます。

vpm.anatawa12.com

基本的にはアバターのルートオブジェクトに追加するだけでOKです。

そのため、Prefab Variantで管理している場合、ルートのVariantに適用してしまうのがおすすめです。

1アバター1衣装の場合、目に見えたパフォーマンスランクの向上は起きないですが、複数衣装を組み合わせて着ている場合などは効果を発揮すると思います。

メッシュを統合する

Merge Skinned Meshコンポーネントを使用することで、複数のメッシュを1つにまとめることができ、Skinned Meshes、Material Slotsの数を減らすことができます。

vpm.anatawa12.com

注意点

なんでも統合していいというわけではなく、顔のメッシュを統合してしまうと逆に負荷が増えてしまうため、顔だけは統合しないようにする必要があります。

また、メッシュのBoundsやRoot bone、Anchor Overrideも個別で設定してあげる必要があるため、MA Mesh Settingsで設定してあげるのがよいです。

【初心者向け全部盛り】Prefab Variantで管理しつつModular Avatarで衣装の着せ替えをやってみよう - 一年中こたつ出てる

統合したとしても統合前のオブジェクトに対してのマテリアルの変更やBlendShapeの変更は追従してくれるため、色変更やシェイプキーの変更アニメーションを組むのは今まで通りやれば問題ありません。
が、メッシュのオンオフに関するアニメーションだけは追従してくれません。

全部統合したらアニメーションで服のオンオフができなくなった!使い物にならん!みたいなのをちょくちょく見るんですが、オンオフしたい単位でまとめて、まとめたオブジェクトをオンオフするアニメーションを組めばうまく動きます。

こちらのサフィーちゃんを例に、カーディガンは単体で、靴と靴下はまとめてオンオフしたいけどあとはそのままでいいとしてまとめてみます。

こんな感じで空のオブジェクトを作成し、それぞれにAAO Merge Skinned Meshコンポーネントを追加し、メッシュのあるオブジェクトを要素に追加していきます。
どうせなら身体とかも合体させちゃうかということで_Othersオブジェクトのほうに入れてみました。

このようにしたあとに、カーディガンに対してはSailorLoliRe.Cardiganオブジェクトをオンオフするアニメーションを、靴と靴下は_Socks_Shoesオブジェクトをオンオフするアニメーションを組めばOKです。

服で見えない素体部分のメッシュを削除する

Remove Mesh By BlendShape

Remove Mesh By BlendShapeコンポーネントを使用することで、いままでは絞っていただけのシェイプキーでポリゴン自体を消すことができます。

vpm.anatawa12.com

このように服で隠れちゃって見えなくなるようなところは消しちゃいましょう。

消したいところがあるオブジェクトにAAO Remove Mesh By BlendShapeコンポーネントを追加し、消したいシェイプキーにチェックをいれるだけで消えてくれます。

貫通対策として絞ることが多いと思いますが、絞るかわりにこちらを使うのがよいです。

Remove Mesh in Box

また、ポリゴンを消すものとしてRemove Mesh in Boxコンポーネントというのもあります。

vpm.anatawa12.com

サフィーちゃんはアホ毛を消すシェイプキーが付いておらず、よく帽子を貫通して出てきてしまいますが、アホ毛をボックスで囲んであげればアホ毛だけ消すことができます。

このようにたくさん囲むことも可能です。

こんな感じでやってます

一通り紹介しましたが、自分はこんな感じでやっていますという雑にまとめた図も共有しておきます。

自己流なので、他の方のアバターがどうやって管理されてるのか気になります…。

さいごに

この8ヶ月間、様々な集会に参加しましたが、VRAM16GBでも全然足りない集会が多々ありました。
とても重たいので表示人数を絞るのですが、表示人数を絞ったとしても現在のVRChatの仕様ではVRAM上に乗ってくるのであまり効果はないようです。

いつも一緒に遊んでいるフレンドの中でもスペックが厳しい人がいます。
人が増えるたびに重そうに苦しんでいるのを見て、どうせなら気持ちよく一緒に遊びたいなぁと感じていました。

そういった日々の経験から、自分はなるべくアバターの最適化をやるようになりました。
どうせならフォールバックアバターではなく、かわいく着飾った自分をもっと見てほしいですしね。

自分もめんどくさがりなので、継続して取り組める程度の最適化しかやっていませんがやらないよりはマシということで、ちょっとでも気にしてくれる人が増えるといいなと思っています。

【せんでん】
他にもModular Avatarについての記事を書いてるのでよかったらみてみてください!

kxn4t.hatenablog.com

kxn4t.hatenablog.com