Resonite アバター最適化 Tips
はじめに
このTipsの内容は上級者向けです。アバターの最適化&軽量化のノウハウを取り扱います。
アバター最適化は楽しくない作業です。そんな最適化作業に邁進しようとする人々に寄り添う事ができたら幸いです。
アバター最適化の基本
- スロットは整理整頓しましょう。
(ぐちゃぐちゃだと、作業するのが大変です。整理する為なら、スロットを追加して構いません。) - 不必要な物(アセット・スロット・コンポーネント等)は消しましょう。
(このような老廃物は適宜消しましょう。) - 最適化及び軽量化は全ての作業に優先します。
(後からやるのは大変です。)
ここで言う最適化や軽量化の定義について
最適化は、描画負荷軽減や処理負荷軽減の事を指します。
軽量化は、保存容量削減や読込負荷軽減の事を指します。
作業内容によっては、両方に効果がある物や、相反する効果がある物もあります。
自身の現状を把握して、必要な作業を実施してください。
まとめ
- 原則として、頂点数は6万以下にしましょう。特に、ブレンドシェイプが付いているMeshは、頂点数が少ない方が良いです。
使用しないブレンドシェイプは除去しましょう。
場合によってはMeshを分割した方が良いかも。(元から頂点数が少ないのであれば、分割する必要はありません。) - テクスチャは、2K以下に変更しましょう。(アトラス化されているテクスチャは1枚だけなら4Kでも良いかも。)
- Materialは少ない方が良いです。なるべく統合しましょう。
一部のMaterial(Refraction・Blur・Fur等)は描画負荷が高いので使用を控えましょう。
透明Materialも最小限の使用に留めましょう。(特にTransparent等はヤバイです。素直にCutoutやAlphaを使用しましょう。)ついでに、半透明なMeshRendererは影をOFFにしましょう。
PBSMaterialは描画負荷が低いので、積極的に使用しましょう。一方でToonMaterialは描画負荷が高い上に、綺麗な見た目にする為にはTexture枚数も多くなりがちです。 - 音・ライト・パーティクル等をアバターに仕込むのは極力控えましょう。(オモチャやツール等は、必要な時にインベントリーから取出せばいいのです。)
もしアバターに仕込む場合は、数を少なくしましょう。AudioOutputはなるべく少なく、ライトは1個で照射距離はなるべく短く、パーティクルは最大放出量をなるべく少なく抑えましょう。 - ギミック不使用時は、Fluxやコンポーネントを無効化しましょう。
- 不必要なコライダーは消しましょう。もしコライダーを追加するのであれば_rigCollidersEnabledStates(list)に追加しましょう。
多くの手法を解説する予定ですが、あくまでも上級者向けであり、初心者や通常のユーザー向けではありませんのでご注意ください。
Resoniteにはアバター容量等の制限がありません。初めは自由に思うがまま、アバターセットアップを存分に楽しんでください。
成長して最適化の重要性に気が付いたとき、ここへ戻ってきてください。
ユーザー側の設定項目で、読込むテクスチャのサイズが制限できます。(GPUのメモリーが少ない人は、上限を2K以下に設定しておくと安心です。)
さらに、ユーザー毎に「アバターを非表示」にする設定もあります。(描画負荷の高いアバターや、不快な見た目のアバターを非表示にすることができます。)
ホストは、ユーザーをBAN(セッション再入場禁止)できます。
全ての作業はResonite内で完結する内容です。もっと本格的に行いたい方は、Blenderや画像編集ソフトを使いこなして頑張ってください。
内容を熟考し、実験し、理解してからアバターの設定を弄りましょう。
公式Wikiの最適化ガイドラインも参考になります。
目次
コライダーを調整する
初期設定のアバターコライダーは、見た目と当たり判定が大きくかけ離れています。
そこで、コライダーの位置や大きさを全て手動で調整する事で、見た目と当たり判定を合致させます。
これにより、様々なアイテムの挙動が改善されます。
さらに、追加されたコライダーをrigCollidersEnabledStates(list)に追加する事で、処理負荷の軽減も行います。
事前に、コライダーの解説もご覧ください。
_simplifiedColliderEnabled機能。(ローカル、約2mで動作。)
- CenteredRootの大きなカプセルコライダー。
_rigCollidersEnabledStates(list)での制御。(ローカル、約2mで動作。)
- Headのスフィアコライダー
- Hipsのカプセルコライダー
- Chest 〃
- UpperArm L 〃
- UpperArm R 〃
- LowerArm L 〃
- LowerArm R 〃
- Hand Lのボックスコライダー
- Hand R 〃
- UpperLeg Lのカプセルコライダー
- UpperLeg R 〃
- LowerLeg L 〃
- LowerLeg R 〃
- Foot L 〃
- Foot R 〃
以上です。
これ以外のコライダーは極力、消しましょう。
標準のコライダー15か所を設定します。
- それぞれのスロットを開く。
- それぞれのColliderコンポーネントを探す。
- それぞれの「コライダーを可視化」ボタンを押す。
- それぞれのOffsetで位置を、Radius等で大きさを調整する。
CenteredRootの大きなカプセルコライダーを設定します。
- CenteredRootスロットを開く。
- CapsuleColliderコンポーネントを探す。
- 「コライダーを可視化」ボタンを押す。
- Offsetで位置を、Radius等で大きさを調整する。
後から追加したコライダーをrigCollidersEnabledStates(list)に登録します。
- AvatarRootスロットを開く。
- VRIKAvatarコンポーネントを探す。
- _rigCollidersEnabledStates(list)のAddを押して増やす。
- 追加したコライダーのEnabledをリストに登録する。
(近距離でローカル動作するアバターギミックのActiveもここに入れて、最適化してしまう裏技がある。)
不必要な影を消す
アバターの落ち影(地面等にできる影)を消して、描画負荷を軽減します。
例えば、アバターのSkinnedMeshRendererは幾つかに分かれていると思います。(頭・体・髪・上着・下着・靴・アクセサリーなどなど)落ち影は像がなんとなく分かれば良いので、全ての影を忠実に描画する必要はありません。体とほぼ同じ輪郭の下着や、面積の小さなアクセサリー等は、影の描画をしなくても違和感はありません。
また、眼鏡等の影をOffにすることで顔に落ちる影を無くす事もできます。
ちなみに、透明マテリアルの影は描画負荷がとても高いので、積極的に影をOffにしましょう。(Unlitマテリアル等は、最初から落ち影がありません。)
- 影をOFFにしたいSkinnedMeshRendererコンポーネントを探す。
- ShadowCastModeを「On」→「Off」に変更する。
- スポットライト等を当てて、落ち影を確認してみてください。
- 頂点数が超多い場合は、影の描画負荷も超高くなります。
頂点数が少ないメッシュがある場合は、頂点数が超多いメッシュレンダラーを影無しにして、頂点数が少ないメッシュレンダラーを影のみにすることで、影の計算負荷を抑えることができます。
この手法はアバターに限らず、アイテムやワールド製作でも活用できます。
- RenderTransformOverride等を使用して頭をローカルで非表示にすると、当然ながら影が落ちません。
そんな時は、透明だけど影が落ちるマテリアル(PBSスペキュラ等)を使用するか、メッシュレンダラーを影のみに設定することで、ローカルで頭の影のみを表示する事ができます。
- 影の設定についてはMeshRenderer等をご覧ください。
手動でバウンディングボックスを設定する
軽量化メインではなく、見た目を綺麗にしつつ最適化する作業になります。
アバターの各SkinnedMeshRendererのバウンディングボックス設定を、個別計算ではなく一纏めにします。
これにより、ライトに照らされた時のちらつきが低減します。
さらに、その一つを手動でバウンディングボックス設定する事で、近付くと禿げたり靴が消えたりする現象を回避します。
- まず、アバターの一番大きなSkinnedMeshRenderer(体)の設定を弄ります。
- 「現在のポーズから明示的にバウンディングを計算する」ボタンを押す。(注意:「現在のポーズから明示的なバウンディングを拡張する」ボタンを先に押さないでください。)
- ExplicitLocalBounds項目の値を手動で調整します。(ギズモを出しながら作業すると捗ります。)
xyzxyzの6個の数値(左下後右上前)で、大きさを設定します。
少し大きめで設定します。特に下側は余裕があると良い。(大き過ぎはダメです。適度な大きさにしましょう。)
- つぎに、他のSkinnedMeshRendererの設定を弄ります。
- BoundsComputeMethod項目を、Proxyモードに設定します。
- ProxyBoundsSource項目に、先ほど設定したSkinnedMesh(体)を指定します。
注意:BoundsComputeMethodをFastDisjointRootApproximateモード等に設定する方法は計算負荷が高くなるのでダメです。
アバターにLODを設定する
LODについては、LODGroupをご確認ください。
大抵のアバターはLOD用の3Dモデルが無いので、あくまでも表示or非表示の設定になります。
事前に手動でバウンディングボックスを設定してください。
遠くからアバターを見た時、アクセサリー等の小さな物はほとんど見えません。
さらに遠くからだと、体や髪などの輪郭しか分からないと思います。
これらを描画し続けるのは無駄なので、画面上で小さく映る物は非表示にします。
小さなアクセサリー類や、遠くからだと判別できない髪や衣装類、ブレンドシェイプが大量にある顔がLOD設定対象です。
個別に設定する事も可能ですし、複数のSkinnedMeshRendererをまとめて制御する事も可能です。
- SkinnedMeshRendererを探す。
- LODGroupコンポーネントをアタッチ。
- LODs(list)を追加。
- Renderers(list)を追加して、SkinnedMeshRendererを指定。
- ScreenRelativeTransitionHightを設定。(確認しながら適切な割合を探ってください。)
使用していないブレンドシェイプを除去
ブレンドシェイプは意外と重いです。徹底的に減らしましょう。
とくに、最新のアバターは大量のブレンドシェイプが付いているのが当たり前になっています。
そんなアバターは、使用しないブレンドシェイプを除去するだけでも、大幅に処理負荷と読込負荷を軽減できます。
この操作は、戻すことができません。除去前にアバターを保存してください。
除去したくないブレンドシェイプは、一時的にValueCopy等でドライブ状態にしてください。
- SkinnedMeshRendererを探す。
- 「使用していないブレンドシェイプを除去」を押す。
空のボーンの除去
メッシュと無関係のボーンを除去します。
事前にSkinnedMeshRendererページを確認してから実行してください。
この操作は、戻すことができません。念の為、アバターのバックアップを保存してから実行してください。
- SkinnedMeshRendererを探す。
- 「空のボーンの除去」を押す。
アバターを素早く動かしながら写真を撮影すると、髪や靴等のパーツがズレて写る場合があります。
「空のボーンの除去」を行う事で、直る場合もあるし、ズレが発生してしまう場合もあります。
もし、ズレが発生してしまった場合は、当該パーツの「空のボーンの除去」はしない方が良いかもしれません。
詳しくは、SkinnedMeshRendererページをご確認ください。
マテリアルを減らす(Material Property Block)
マテリアルを減らす事は、軽量化及び最適化の基本であり必須項目です。
頑張ってマテリアルを減らしましょう。
同じマテリアルを使用する場合は、アセットを徹底的に使いまわしましょう。(同じマテリアルなのに、違うアセットを使うのは愚の骨頂です。)
テクスチャのアトラス化が効果的です。(そのうち解説を書きます。)
もしかするとMaterial Property Blocksが役に立つかもしれません。
メインテクスチャだけ違うマテリアルがある場合、マテリアルを共通化する事ができます。
- SkinnedMeshRendererを探す。
- 同じスロット等に、MainTexturePropertyBlockコンポーネントをアタッチして、Textureを指定する。
- SkinnedMeshRendererコンポーネントのMaterialPropertyBlocks(list)に追加する。
- それぞれに行う。
共通化したマテリアルのメインテクスチャの消し忘れに注意しましょう。
テクスチャ(画像)について
テクスチャ枚数はなるべく少ない方が良いです。
同じテクスチャを使用する場合は、アセットを徹底的に使いまわしましょう。(同じテクスチャなのに、違うアセットを使うのは愚の骨頂です。)
テクスチャ解像度は2の冪数(256、512、1024、2048、4096等)が効率的です。
解像度が低い方が軽くなります。(4096以上はサイズ調整をお勧めします。)
- テクスチャアセット(StaticTexture2D)を探す。
- 「長辺:」を入力して、「再調整」ボタンを押す。
Resoniteでは、ユーザー側で読み込むテクスチャのサイズ(解像度)を設定できます。
設定 > グラフィック > テクスチャ品質
上限を設定している場合、本来のテクスチャサイズで表示されないかもしれません。(アバター設定を行う際は、上限を解除しておきましょう。)
注意!
StaticTexture2Dの「MaxSize」を、テクスチャのサイズ設定と勘違いしている事例をよく見かけます。
MaxSizeで指定したサイズは、表示サイズの事です。保存する際は本来のテクスチャサイズで行われます。
Resoniteではユーザー各々がテクスチャ最大サイズを設定できるので、アセット側でMaxSizeをわざわざ設定する必要はありません。
軽量化をするのであれば、長編の再調整を行いましょう。
アルファ(透明)を使用していないテクスチャは、アルファを取り除きましょう。圧縮効率を上げる事ができます。
- テクスチャアセット(StaticTexture2D)を探す。
- 「アルファを取り除く」ボタンを押す。
- BC3圧縮等からBC1圧縮等になります。(画像タイプによって圧縮方式が異なります。)
雛形(編集用)
あ
メモ(執筆予定)
- 不必要なアセットは消そう
- 使用しないDBCは止める
- MeshのUV編集(アトラス化)
- テクスチャの編集(アトラス化)
- PBSマテリアルはイイゾ
- スキンドメッシュベイク
- FluxのStandardControllerは激重
- 距離に応じてギミックをOffにする
- 常時動くコライダーは激重