アバター最適化のヒント
本ガイドは、アバター最適化のすべてを網羅するものではありません! アバターを適切に最適化するには、非常に多岐にわたる知識が必要です。すべてを把握していることは求めていません。
とはいえ、見落とされがちな一般的な項目や、達成すべき重要な目標について、このドキュメントを常に最新の状態に保つよう努めています。
最適化のヒントについて意見がある場合は、右上の Suggest Edits ボタンから独自のアドバイスを追加してください!
アバターを効率化し、他のユーザーのフレームレートを維持することで、誰からも愛されるアバターにしたいと思いませんか?以下のヒントに従えば、きっとうまくいきます!
本ドキュメントで推奨されている数値や制限は、予告なく変更される可能性があります。以下で提供される説明には技術的に厳密ではない部分も含まれますが、本書は初心者ユーザーがアバターの最適化方法を学ぶ一助となることを目的としています。
Cats や Tuxedo といったコミュニティ製の Blender プラグインを使用すると、モデルの最適化が非常に簡単になり、VRChatのアバターでよくある問題の解決をサポートしてくれます。このようなツールの利用を強く推奨します!作業が楽になるだけでなく、全員のパフォーマンス向上にもつながります。
補足として、SDKの Build Control パネルでは、最適化の目安としてアバターのコンポーネント数を確認できます。
Android/Quest向けにコンテンツを最適化する
Android向けにコンテンツを開発する際は、コンテンツの制限に留意してください!例えば、アバターはすべてのシェーダーやアバターコンポーネントを利用できるわけではありません。
さらに、Android向けにコンテンツを最適化することをお勧めします。これによりアバターのパフォーマンスランクが向上し、より多くのプレイヤーにアバターを表示できるようになります。
Dynamic Bones を使用しないでください!
Dynamic Bones は、アバターのリグにボーンを設定し、ぶら下がっているかのように揺らすことができる Unity アセットです。重力などの静的な力を設定して、髪をよりリアルに垂らすといったことも可能です。
Dynamic Bones は非推奨となっており、将来的には削除される予定です。代わりに PhysBones を使用してください。
VRChat は実行時に自動的に Dynamic Bones を PhysBones へ変換します。
Unity Constraintsは使用しないでください!
Unity Constraintsは、1つ以上の他のTransformに基づいて、アバター上のTransformの回転、位置、スケールを変更できるエンジン提供のコンポーネントです。
エンジンのConstraintsはフレームごとに依存関係に基づいてソートされるため、大量に使用すると深刻なパフォーマンスの問題を引き起こす可能性があります。VRChatのアバター環境下でより高いパフォーマンスを発揮するように設計されたVRChat Constraintsを使用してください。
VRChatは、実行時に自動的にUnity ConstraintsをVRChat Constraintsへ変換します。
Cloth の使用を制限する
Cloth は Unity の標準コンポーネントであり、Dynamic Bones と同程度の負荷がかかるうえ、セットアップもより困難です。Cloth の使用は厳しく制限し、200頂点を超えるようなメッシュには適用しないでください。
アバターのメッシュ数を減らす
アバターが持つ Mesh Renderer には、Static Mesh Renderer と Skinned Mesh Renderer の2種類があります。Static Mesh は変形しません。一方、Skinned Mesh には通常、ボーンの位置に基づいてメッシュをどのように動かし変形させるかをエンジンに伝えるリグ(ボーン)が含まれています。これらの Skinned Mesh は処理負荷が非常に高いため、アバターに使用する Skinned Mesh Renderer は1つだけに留めるべきです。複数使用する理由はほとんどなく、多くの場合、追加のアイテムは元のモデルに統合できます。
さらに、アバターのメッシュが増えるごとに、「ドローコール(Draw Calls)」が1つ以上発生します。これは本質的に、プロセッサがグラフィックカードに対して画面上に何かを描画するよう指示するために費やす時間です。
そのため、VRChat では Skinned Mesh Renderer を最大1つ、Static Mesh Renderer を最大3つに抑えることを推奨しています。 Blender でメッシュを統合するのは非常に簡単であり、以下の Meshes に関する動画で紹介されています。
最後に、過剰なポリゴン数(三角形の数)を使用していないか確認してください。PC で70,000ポリゴン、Quest で20,000ポリゴンを超えるモデルをアップロードしようとすると、SDK が警告を出します。詳細な表現のためにこれほど多くのポリゴンが必要になることは稀です。ノーマルマップのベイク処理や、デシメーションまたはリトポロジーによるメッシュの簡略化を検討してください。
Quest 用のアバター制作は制限が厳しいため、難易度が高くなることがあります。最も効果的な最適化は、設計やアバター制作の初期段階で行われます。言い換えれば、レンダリング用に作られた120,000ポリゴンのモデルを無理やり20,000ポリゴンに収めようとすれば、問題が発生するのは当然です。わざわざ苦労するようなことはせず、最初からポリゴン数が少ないモデルを探しましょう。20,000ポリゴンあれば十分な余裕があります。
特に Cats Blender Plugin を使用している場合、「Fix Model」を実行すると自動的にメッシュが統合されます。デシメーションや編集作業のために Cats を使用してマテリアル別や個別のパーツ(Loose Parts)にメッシュを分離した場合は、忘れずに再度メッシュを統合してください。
マテリアルスロットの使用数を削減する
マテリアルスロットが1つ増えるごとにドローコールも1つ増えるため、処理時間が増大します!マテリアル数が多い(10個を超える)場合は、テクスチャアトラス(Texture Atlasing)の利用を検討してください。コミュニティが作成したツールを使えば、アトラス化は非常に簡単に行えます。詳細は Materials の動画を確認してください。
補足として、重要なのはアバターの Renderer components にある material slots の数です。同じマテリアルを20個のスロットに設定していたとしても、技術的には20個の「マテリアル」として扱われます。
これは、Unity がメッシュをサブメッシュに分割する仕組みによるものです。パフォーマンスにおいて真に重要なのは、作成されるサブメッシュの数であり、Unity はこれを Material slots に基づいて作成します。
VRAMの使用量に注意!
テクスチャアトラスを使用していたとしても、以前よりも多くのVRAMを消費してしまう可能性があります!
テクスチャはVRAMを大量に消費します。テクスチャの解像度が高ければ高いほど、消費されるVRAMも増大します。高解像度のテクスチャをいくつも使用することは避け、Unityのインポート設定にある「Max Size」パラメータを調整してサイズを削減するようにしてください。
例えば、ダウンロードサイズが30 MBのアバターであっても、非効率的な高解像度テクスチャを使用していると、VRAMを3 GBも消費することがあります。アバターのダウンロードサイズだけで判断しないようにしましょう。
Poiyomi's Texture Optimization guideも併せて確認してください。アバターのテクスチャを最適化する方法について、非常に優れた包括的なガイドです。
最適化されたシェーダーを使用する
シェーダーによっては、GPUでのレンダリングに過大な時間を要するものがあります。UnityのStandardシェーダーや、パフォーマンスが良いと分かっているシェーダーを使用するようにしてください。シェーダーが十分に最適化されているかどうかの判断がつかなくても問題ありません。以下にいくつかの例を挙げます。これらは利用可能なすべてのシェーダーを網羅しているわけではありませんが、どれもよく作られており、様々な機能を備えた最適化済みのシェーダーです。
- VRChatのSDKには、'Standard Lite' のようにモバイルデバイス向けに最適化された様々なシェーダーが含まれています。
- Xiexe's "XSToon" Unity Shaders (MIT) - Unity向けのPBR 'Toon' シェーダーコレクションです。
- Silent's Shaders (MIT) - セルルックシェーディング用シェーダーです。開発が終了したCubedParadox's Flat Lit Toonをベースに、便利な機能を多数追加しています。
- Poiyomi's Toon Shader (MIT) - 非常に堅牢かつ強力で、豊富なオプションを備えたシェーダーです。
不要なシェーダーパスを最小限にする
技術的な話をすると、過剰なシェーダーパスを持つシェーダーは避けるべきです。これはドローコールの増加を招きます。ほとんどのユーザーにとっては少し専門的すぎるかもしれませんが、一般的に使用されている実績のあるコミュニティ製のシェーダーを使用していれば、それで十分です。
テッセレーションを避ける
アバターのシェーダーでテッセレーションを使用することは、常に避けるべきです。 これは「ファー(毛皮)」シェーダーによく見られます。テッセレーションは、グラフィックスカードがメッシュを細分化して様々なエフェクトを生み出す手法です。しかし、このエフェクトは非常に負荷が高く、最高性能のグラフィックスカードであっても動作を遅くしてしまいます。テッセレーション効果のあるシェーダーは使用しないでください。 ファーのエフェクトが必要な場合は、XSFurやWarren's Fast Fur Shaderのように、テッセレーションを使用せずに同様の効果を再現できるシェーダーを検討してください。
キーワード
過剰な数のシェーダーキーワードを使用するシェーダーも避けるべきです。これにより、VRChat内での描画に深刻かつ予測不可能な問題が発生したり、出力ログが重複するエラーメッセージで埋め尽くされたりする可能性があります。シェーダーに過剰なキーワードを含める必要はありません。目的の機能に必要なものだけを使用するようにしてください。
キーワードのクリア
シェーダーを変更またはアップグレードする際は、マテリアルから古く使用されていないキーワードを確実に削除してください。過剰なキーワードを使用することは、パフォーマンスと最適化の観点から非常に悪影響です。自分のアバターに問題が発生するだけでなく、他のユーザーがすべてのシェーダーを正しく表示できなくなる可能性があります。
VRChat SDKには、アバターのマテリアルからキーワードを削除するツールが含まれています。このツールは必要なキーワードまで削除してしまう可能性があるため、注意して使用してください。
基本的には、このツールでキーワードを確認することをお勧めします。もしキーワードが多すぎる場合は、別のシェーダーを探す必要があるでしょう。 一度Standardシェーダーに切り替えてキーワードをクリアしてから、新しいシェーダーに切り替えてください。
シェーダー制作者向けメモ
自身のキーワードとして、Standardシェーダーが予約しているキーワードの使用を検討することをお勧めします。これらは実質的に既に予約されていることが保証されているため、どうしてもキーワードを使用する必要がある場合は、StandardやPost Processing v2によって既に定義されているものを使用してください。推奨されるキーワードのリストはこちらです。
アルファ透過
アルファ透過も、シェーダーにおいて負荷の高い要素の一つです。通常は、シェーダーのCutoutモードやOpaqueモードを使用するのが理想的です。透過処理は非常に負荷が高くなる可能性があるため、仕組みを理解している場合のみ使用してください!
ドローコールの測定
Unity Profilerは、発生しているドローコール数を判断するのに非常に役立ちます。測定時は、公平な環境を作るために、Directional Lightの影(Shadows)をオフにすることを忘れないでください。
ボーンの数を減らす
スカーフやスカート、髪の毛などに使われていないボーンがたくさんある場合でも、それらはスキニングの呼び出し時に余計な負荷となり、GPUに負担をかける可能性があります。使用しないボーンがある場合は、そのボーンを削除して親ボーンに統合することを検討してください。ボーンのウェイトを親ボーンに統合する方法については、前述の Dynamic Bones に関する動画を確認してください。ボーンの統合に関する手順が含まれています。
パーティクルシステムの放出量を削減する
パーティクルシステムは素晴らしいエフェクトを多数生み出せますが、過剰な量を使用すると一部のPCで問題を引き起こす可能性があります。使用するパーティクルシステムの数を制限し、一度に放出されるパーティクルの最大量にも制限をかけましょう。
大量のパーティクルを使用しつつパフォーマンスを維持する方法もあります。興味がある場合は、スプライトパーティクルのダイナミックバッチングについて調べたり、コリジョンを使用しないようにしたり、パーティクルの動きを単純化したりすることをお勧めします。
技術的な知識がある場合は、UnityのProfilerビューを使用して、パーティクルシミュレーションがどれだけのCPU時間を消費しているかを確認してみてください。一般的に、大きな半透明のパーティクルは、小さく不透明なパーティクルを多数使用するよりも負荷が高くなります。UnityのParticle Systemは、適切に使用すれば非常に最適化されており、高速に動作します。
アバターで使用するライトの数を制限する
アバター上のライトはリアルタイムで処理されるため、非常に負荷が高い機能です。アバターにライトを追加すると、そのライトが照らすあらゆるオブジェクトのドローコールが2倍になります。ライトを追加するほど、この影響は増大します。これは明らかにパフォーマンスにとって非常に悪影響です。常時点灯するようなライトは使用しないでください。懐中電灯のようにオン/オフを切り替えたい場合は Animation Override を使用するか、そもそもライト自体を使用しないようにしてください。
どうしてもライトを使用する場合は、そのライトの Shadows をオフにしてください。リアルタイムライトの影は非常に負荷が高く、動き回るオブジェクトに対しては見た目もそれほど良くないことが多いです。
Particle Systems では、パーティクルごとにライトを適用するように設定できます。絶対にこれを行わないでください! ライト付きのパーティクルはそれぞれがリアルタイムライトとしてカウントされるため、前述の通り非常に負荷が高くなります。
VRChatでは、原則としてアバター上でいかなる種類のライトも使用しないことを推奨しています。 ライトは自分自身のアバターのパフォーマンスを低下させるだけでなく、そのライトが当たっている他のアバターのパフォーマンス負荷も増大させてしまいます。
推奨ソフトウェア・プラグイン
アバターの最適化や制作を効率化するためのソフトウェアが多数存在します。
例えば、Unity Editorで使用できる Pumkin's Avatar Tools (MIT) を確認してみてください。このエディタースクリプトを使用すると、アバターの統計情報を素早く確認できるなど、様々な便利な機能を利用できます。このツールはベータ版であり、不具合が含まれている可能性があります。問題が発生した場合は、Pumkin氏のGitHubまで報告してください。
以下のソフトウェアはVRChatによって作成されたものではありません。各製品に付属するライセンスを読み、遵守してください。
最終更新: