VRChat 非公式日本語ドキュメント

アバター最適化のヒント

注意

このガイドはアバター最適化のすべてを網羅するものではありません! アバターを適切に最適化するには、非常に多岐にわたる幅広い知識が必要です。私たちは、誰もがすべてを知っているとは想定していません。

しかし、私たちは見落とされがちな一般的なポイントや、達成すべき最も重要な目標について、このドキュメントを常に最新の状態に保つよう努めています。

最適化のヒントについてご意見がある場合は、右上の Suggest Edits ボタンを使用して、ぜひご自身の知識を追加してください!

アバターを効率化し、負荷を軽減することで皆に愛される存在にしたいですか?以下のヒントに従えば、きっとうまくいきます!

本書で推奨される数値や制限は、予告なく変更される場合があります。以下の説明には技術的に厳密ではない部分も含まれていますが、本書は初心者ユーザーがアバターの最適化方法を学ぶ一助となることを目的としています。

CatsTuxedoのようなコミュニティ制作の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つまたは複数の他のトランスフォームに基づいて、アバター上のトランスフォームの位置、回転、スケールを変更できるエンジン提供のコンポーネントです。

エンジンのコンストレイントは毎フレーム依存関係に基づいてソートされるため、多数使用すると重大なパフォーマンス問題を引き起こす可能性があります。代わりにVRChat Constraintsを使用してください。これらはVRChatアバターの文脈でより高いパフォーマンスを発揮するように設計されています。

VRChatは、実行時にUnityのコンストレイントをVRChatのコンストレイントへ自動的に変換します。

Clothの使用を制限する

ClothはUnityの標準コンポーネントであり、Dynamic Bonesと同程度の負荷がかかる上、セットアップもより困難です。Clothの使用は極力控え、200頂点を超えるメッシュには適用しないでください。

アバターのメッシュ数を減らす

アバターには「Static Mesh Renderer」と「Skinned Mesh Renderer」という2種類のMesh Rendererが存在します。Static Meshは変形しません。一方、Skinned Meshには通常、ボーンの位置に基づいてメッシュをどのように動かし変形させるかをエンジンに指示するリグ(ボーン)が含まれています。これらのSkinned Meshは非常に負荷が高いため、アバターに使用するSkinned Mesh Rendererは1つに留めておくべきです。これを複数持つ理由はほとんどありません。多くの場合、追加のアイテムは元のモデルに組み込むことが可能です。

さらに、アバターにメッシュを追加するたびに「ドローコール(Draw Calls)」が1つ以上増加します。これは本質的に、プロセッサがグラフィックスカードに対して画面に何かを描画するよう指示するために費やす時間のことです。

そのため、VRChatでは、Skinned Mesh Rendererを最大1つ、Static Mesh Rendererを最大3つまでにすることを推奨しています。 メッシュの統合はBlenderで非常に簡単に行うことができ、以下のメッシュに関する動画で解説されています。

最後に、ポリゴン数(三角形の数)が多すぎないか確認してください。PC向けでは70,000、Quest向けでは20,000の三角形を超えるモデルをアップロードしようとすると、SDKが警告を表示します。詳細な表現のためにこれほど多くのポリゴンが必要になることは非常に稀です。ノーマルマップのベイクや、Decimation(削減)やリトポロジーによるメッシュの簡略化を検討してください。

Quest用のアバター作成は制限が厳しいため、より難易度が高くなります。最も効果的な最適化は、初期の設計やアバター作成の段階で行われます。言い換えれば、レンダリング用に作られた120,000ポリゴンのモデルを無理やり20,000ポリゴンに収めようとすれば、問題が発生します。わざわざ難しくするようなことはせず、最初からポリゴン数の少ないモデルを選びましょう!20,000あればかなりの余裕があります。

特にCats Blender Pluginを使用している場合、「Fix Model」を実行すると自動的にメッシュが結合されます。Catsを使用してデシメーションや編集のためにメッシュをマテリアル別、あるいはLoose Parts別に分離した場合は、忘れずに再度メッシュを結合してください。

使用するマテリアルスロットの数を減らす

マテリアルスロットが増えるたびにドローコールも増加し、プロセッサの処理時間を多く消費します!マテリアルの数が多い場合(10個以上)、テクスチャアトラス化を検討してください。コミュニティ製のツールを使えば、アトラス化は非常に簡単に行えます。詳細はマテリアルに関する動画を確認してください。

補足として、重要なのはアバターのRendererコンポーネントにあるマテリアルスロットの数です。同じマテリアルを20個のスロットに設定していたとしても、技術的には20個の「マテリアル」として扱われます。

これはUnityがメッシュをサブメッシュに分割する仕組みによるものです。パフォーマンスにおいて真に重要なのは作成されるサブメッシュの数であり、Unityはマテリアルスロットに基づいてこれを決定します。

VRAMの使用量に注意してください!

テクスチャアトラスを使用したとしても、結果的に以前よりも多くのVRAMを消費してしまう可能性があります!

テクスチャはVRAMを大量に消費します。各テクスチャの解像度が高ければ高いほど、消費されるVRAMも増加します。高解像度のテクスチャをいくつも使用することは避け、Unityのインポート設定にある「Max Size」パラメータを下げてサイズを縮小してください。

例えば、30MBのアバターであっても、非効率な高解像度テクスチャを使用していると、3GBものVRAMを消費することがあります。アバターのダウンロードサイズだけで判断しないようにしましょう。

Poiyomiのテクスチャ最適化ガイドを確認してみてください。アバターのテクスチャを最適化する方法について、非常に包括的で優れたガイドです。

最適化されたシェーダーを使用する

シェーダーによっては、GPUでのレンダリングに過大な時間を要するものがあります。UnityのStandardシェーダーや、動作が良好だと分かっているシェーダーを使用するようにしてください。どのシェーダーが適切に最適化されているか判別できなくても問題ありません!以下にいくつかの例を挙げます。これらは利用可能なすべてのシェーダーを網羅しているわけではありませんが、どれも作りが良く、様々な機能を備えた最適化済みのシェーダーです。

  • VRChatのSDKには、「Standard Lite」のようにモバイルデバイス向けに最適化された様々なシェーダーが含まれています。
  • Xiexe's "XSToon" Unity Shaders (MIT) - Unity向けのPBR「トゥーン」シェーダー集です。
  • Silent's Shaders (MIT) - 開発終了したCubedParadox's Flat Lit Toonをベースにした、Unity向けのセルルックシェーダーです。便利な機能が多数搭載されています。
  • Poiyomi's Toon Shader (MIT) - 非常に多機能で強力なシェーダーです。

不要なシェーダーパスの削減

技術的な話をすると、過剰なシェーダーパスを持つシェーダーは避けるべきです。これらはドローコールの増加を招きます。多くのユーザーにとっては少し専門的すぎる内容かもしれないため、コミュニティで広く使われており実績のあるシェーダーを使用していれば十分でしょう。

テセレーションの使用を避ける

アバターにはテッセレーション(Tessellation)を使用するシェーダーを避ける必要があります。 これは「ファー(毛皮)」シェーダーによく見られます。テッセレーションとは、グラフィックボードがメッシュを細分化して様々なエフェクトを生み出す手法です。しかし、このエフェクトは非常に負荷が高く、高性能なグラフィックボードであっても動作を低下させる可能性があります。テッセレーション効果のあるシェーダーは使用しないでください。 ファーのような表現を行いたい場合は、テッセレーションを使用せずに同様の効果を再現できるシェーダー(例: XSFurWarren's Fast Fur Shader)の使用を検討してください。

キーワード

過剰なシェーダーキーワードを使用するシェーダーも避けるべきです。これはVRChatでの描画に深刻かつ予期しない問題を引き起こす可能性があり、出力ログが大量の冗長なエラーメッセージで埋め尽くされてしまいます。シェーダーに過剰なキーワードを含める必要はないため、目的の機能に必要なものだけを使用するようにしてください。

キーワードのクリア

シェーダーを変更またはアップグレードする際は、古い未使用のキーワードをマテリアルから確実に削除してください。過剰なキーワードを使用することは、パフォーマンスと最適化の観点から非常に悪影響です。自身のアバターに問題が発生するだけでなく、他のユーザーが all shaders を正しく表示できなくなる可能性があります。

VRChat SDKには、アバターのマテリアルからキーワードを削除するツールが含まれています。このツールは必要なキーワードまで削除してしまう可能性があるため、注意してください!

通常、このツールでキーワードを確認するのが最善です。キーワードが多すぎる場合は、別のシェーダーを探す必要があるでしょう。Standardシェーダーに変更してキーワードをクリアしてから、新しいシェーダーに切り替えてください。

シェーダー作成者への注意点

Standardシェーダーで予約されているキーワードを、独自のキーワードとして利用することを検討しても良いでしょう。これらは基本的にすでに予約されていることが保証されているため、どうしてもキーワードを使用する必要がある場合は、StandardやPost Processing v2ですでに定義されているものを使用してください。推奨キーワードリストはこちらを参照してください。

アルファ透過

アルファ透過もまた、シェーダーの処理負荷を高める要因の一つです。基本的には、シェーダーにはCutout(抜き)またはOpaque(不透明)モードを使用するようにしてください。透過処理は非常に負荷がかかる可能性があるため、仕組みを十分に理解している場合にのみ使用しましょう。

ドローコールの測定

Unity Profilerは、発生しているドローコール数を判断する際に非常に役立ちます。公平な条件で測定するために、Directional Lightの影(Shadows)設定をオフにすることを忘れないようにしてください。

ボーン数を削減する

スカーフやスカート、髪の毛などに使われていないボーンが大量に含まれていると、GPUがスキンニング処理を行う際に余分な負荷がかかる可能性があります。使用しないボーンがある場合は、削除して親ボーンに統合することを検討してください。ボーンのウェイトを親ボーンに統合する方法については、前述のDynamic Boneに関する動画を確認してください。ボーン統合に関する手順が含まれています。

パーティクルシステムの放出量やパーティクル数を減らしてください。

パーティクルシステムは多くのクールなエフェクトを作成できますが、過剰な量を使用すると一部のPCで問題が発生する可能性があります。使用するパーティクルシステムの数を制限し、一度に放出されるパーティクルの最大数も抑えてください。

パーティクル数を増やしつつパフォーマンスを維持する方法もあります。興味がある場合は、スプライトパーティクルのダイナミックバッチングについて調べ、コリジョンを使用せず、パーティクルの動きが単純になるようにしてください。

技術的な知識がある方は、UnityのProfilerビューを確認して、パーティクルシミュレーションがどれだけのCPU時間を消費しているか調べてみてください。一般的に、大きな半透明のパーティクルは、小さな不透明なパーティクルを大量に使用するよりも負荷が高くなります。Unityのパーティクルシステムは、適切に使用すれば非常に最適化されており、高速に動作します。

アバターで使用するライトの数を制限する

アバター上のライトはリアルタイム処理されるため、非常に高い負荷がかかります。アバターにライトを追加すると、そのライトが照らすあらゆるオブジェクトに対して2倍のドローコールが発生することになります。ライトを追加するたびにこの影響は倍増します。これは当然、パフォーマンスにとって非常に悪影響です。常時点灯するライトは使用しないでください。Animation Overrideを使用して懐中電灯のようにオン/オフを切り替えるか、いっそのことライトの使用を控えるようにしてください。

ライトを使用する場合は、そのライトのShadows(影)をオフにしてください。リアルタイムライトの影は非常に負荷が高く、動き回るものに対しては見た目もあまり良くないことが多いためです。

パーティクルシステムは、パーティクルごとにライトを表示するように設定できますが、これは絶対に行わないでください!ライト付きのパーティクルはそれぞれがリアルタイムライトとしてカウントされるため、(繰り返しになりますが)非常に高い負荷がかかります。

VRChatでは、アバターへのあらゆる種類のライトの使用を全面的に控えることを推奨しています。 ライトの使用はあなた自身のアバターのパフォーマンスに悪影響を及ぼすだけでなく、そのライトが照らしている他のアバターのパフォーマンス負荷を倍増させる可能性もあります。

アバターの最適化や制作の効率化に役立つソフトウェアが数多く存在します。

一例として、Unity Editorで使用できる Pumkin's Avatar Tools (MIT) を確認してみてください。このエディタースクリプトを使用すると、アバターの統計情報を素早く確認できるなど、様々な機能が利用可能です。このツールはベータ版であり、不具合が含まれている可能性があります。問題が発生した場合は、Pumkin氏のGitHubに報告してください。

以下のソフトウェアはVRChatによって開発されたものではありません。各製品に付属しているライセンスを読み、遵守してください。

最終更新: