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

Androidコンテンツの最適化

VRChatにおけるAndroid向けコンテンツ制作は、魅力的で惹きつけられるコンテンツを作りつつ、モバイル端末向けに最適化を維持しなければならないという課題があります。これは、モバイル向けにゲームを開発する開発者が直面するものと同じ課題です。

ここでは、VRChatのAndroid向けコンテンツを構築する際に留意すべき一般的なガイドラインを紹介します。

以下の項目は、特に記載がない限り、アバターとワールドの両方に適用されます。

UnityにはVR/AR体験の最適化に関するガイドがあり、非常に有用なポイントが多く含まれています。

また、Lucas RizzottoによるVRコンテンツ最適化に関する素晴らしい動画も存在します。非常によくまとめられており、ここで説明している内容の多くを網羅しています。この動画はVRChatによって作成されたものではなく、またVRChat専用のものでもありません。念のため申し添えますが、過激な表現が含まれている場合があります。本記事の項目の多くが、この動画でも解説されています。

最後に補足ですが、このリストにあるすべての項目は変更される可能性があります。つまり、制限事項や推奨事項はまだ完全に確定したわけではありませんので、その点にご留意ください。

制限の適用

VRChatのAndroid版では、アバターのコンテンツに対していくつかの厳格な(および緩やかな)制限があります。詳細についてはAndroid Content Limitationsページを参照してください。また、ブロック機能の仕組みに関する詳細についてはAvatar Performance Ranking Systemページも併せてご確認ください。

推奨値を大幅に超えるアバターを含むアバターやアバターワールドをアップロードした場合、そのワールドやアバターは公開が停止される可能性があります。

Unity Profiler

私たちは、Unity Profilerを活用することを強く、非常に強く推奨します。Profilerを使用することで、ワールドやアバターのさまざまなパフォーマンス指標を正確な数値として測定できます。特に、シーン内のドローコール数や、コンポーネントが占めるフレーム時間の割合などを確認することをお勧めします。

もちろん、高性能なPC上のプロファイラーはAndroid上のプロファイラーがどのようなものかを表す指標にはなりませんが、特定のコンポーネントが描画と比較してフレーム時間を大幅に消費しているといった状況を確認することは可能です。すべては相対的なものです!

Unity Profilerの使い方は、Unityが提供するProfiler Overview for Beginnersintermediate Introduction to the Profilerなど、数多くのチュートリアルで解説されています。これらのチュートリアルは旧バージョンのUnity向けですが、基本的な概念を理解するには十分役立ちます。

File Size

モバイルプラットフォームではメモリの容量が限られているため、常にその点を意識することが極めて重要です。アセットのサイズは、コンテンツをビルドした後(SDKの「Build & Publish」ボタンを押下)に、エディタログを「statistics」で検索することで確認できます。ここで確認すべきは圧縮前のサイズです。

経験則として、1k(1024x1024)を超えるような大きなテクスチャは避けてください。これらはメモリ使用量が増大する主な原因となります。頂点カラーやフラットカラーを活用することは、テクスチャサイズを削減する上で非常に有効です。

Crunch圧縮は、メモリ内のサイズ削減には効果がないことに注意してください!Crunch圧縮はダウンロードサイズの削減にしか寄与しません。コンテンツパッケージは、Crunch圧縮に頼らずに制限内に収める必要があります。

Worlds

Android版VRChatでは、ビルド時の圧縮後に100MBを超えるワールドをアップロードしたり、アクセスしたりすることはできません。

Avatars

最大で5~8MBを目標にしてください。Android版VRChatでは、ビルド時の圧縮後に10MBを超えるアバターをアップロードしたり、着用・表示したりすることはできません。

ポリゴン数

モバイルプラットフォームでは、ポリゴン数を低く抑えることが非常に重要です。Questはモバイルヘッドセットとしては非常に高性能ですが、それでもハードウェアの制限は存在します。パフォーマンスを高く維持するために、常にポリゴン数に注意を払うことが大切です。

これらの推奨事項は、技術的にはアバターパフォーマンスランクシステムによって強制されています。

Worlds

ワールドを構築する際は、三角形の数を抑えるようにしてください。ユーザーのアバターが表示される分の余裕も残しておく必要があります。ワールド全体の三角形の予算を約250,000に抑えることを推奨します。

Avatars

アバターについても、ワールドと同様の一般的なルールが適用されます。同じ部屋に10人以上のユーザーがいる可能性があることを念頭に置き、三角形の使用数を厳しく制限してください。アバターは三角形の数を10,000未満に抑えることを目標にすることを推奨します。

これは、自分でアバターを作成するのではなく、様々なソースからキャラクターをインポートすることを好むアバター制作者にとっての課題となります。このレベルまで削減(デシメーション)すると形状が崩れる可能性があるため、ポリゴン数を低く保つためにリトポロジーなどの手法を検討する必要があるかもしれません。

メッシュ数

これはワールドとアバターの両方に適用されます。

使用するツールに関わらず、コンテンツで使用するメッシュの数は制限してください。ワールド内の静的オブジェクトについては(オクルージョンカリングが必要なため)それほど重要ではありませんが、アバターにおいては非常に重要となります。

アバターに含めるSkinned Mesh Rendererは必ず1つだけにしてください。アクセサリーや追加パーツは、Blenderのような3D編集ソフトを使用して元のメッシュに結合してください。アニメーションや動きは、すべてシェイプキーまたはボーンで制御するようにします。

近い将来、VRChatのQuest用アバターに対して、メッシュ数の厳格な制限が設けられる予定です。

ワールド制作においては、ワールド内の「オブジェクト」という単位で考える必要があります。地面にある一揃いのポットは1つのオブジェクトとして扱えますが、そのポット群を地面のメッシュにまで結合してしまうことは推奨されません。結合してしまうと、さまざまな最適化の問題が発生するだけでなく、後のワールド編集が困難になる可能性があります。

マテリアル

マテリアル数の削減は、アバターとワールドの両方において重要です。マテリアルが増えるとサブメッシュも増え、その分ドローコール(描画呼び出し)が増加します。ビューポートの描画に必要なドローコール数を減らすことは、非常に重要です。

Worlds

ワールド制作では、マテリアル数を最小限に抑えることを目指してください。もっとも、ワールドに関してはアバターほど厳密でなくても構いません。ワールドはオブジェクトの集合体であると考え、それに合わせてマテリアルをまとめるのが最善です。

例えば、ビーチのシーンを作る場合、椅子、パラソル、ブランケットのセットは、1つのテクスチャアトラス上の1つのマテリアルにまとめるのが適切でしょう。ビーチの少し先にある岩のセットは、別のマテリアルとテクスチャにします。こうすることで、オクルージョンカリングのためにオブジェクトを分離できるようになります。

ワールドでマテリアルの結合やアトラス化を過度に行うと、Unityのバッチング処理や実行時の最適化において、かえって効率が悪くなることがあります。

Avatars

アバターは1マテリアルに抑えることを目標にしてください。ただし、異なるシェーダーバリアントが必要な場合に限り、2マテリアルまで許容されることがあります。テクスチャのアトラス化は必須です。

近い将来、VRChat Quest向けアバターに対して厳格なマテリアル制限が設けられる予定です。

Avatars and Worlds

すべてのマテリアルでGPU Instancingを有効にしてください。実際の利用ケースはより複雑で専門的ですが、有効にしておくのがベストです。

テクスチャ

テクスチャサイズに関する懸念はアバターとワールドの両方に等しく当てはまりますが、アバターのテクスチャサイズは縮小しておくことを忘れないでください。これは、1つのインスタンス内に複数のアバターが存在するためです(ワールドは1つのみです)。

テクスチャサイズを小さく保つことは重要です。最大でも1k(1024x1024)解像度のテクスチャを使用することを目指してください。また、効率的にパックされたアトラスを作成することで、同じサイズでより高いテクスチャ解像度を実現できます。

アバターは圧縮後のサイズが10MB、ワールドは100MBを超えてはなりません。データの大半は通常テクスチャデータであるため、テクスチャを小さくし、適切に圧縮してください。

Crunch圧縮の使用を検討してもよいですが、将来的に新しいUnityバージョンが非互換のCrunchバージョンを採用した場合、アバターが破損する可能性があることに留意してください。

ライティング

このセクションはワールドにのみ適用されます。

ワールドのライティングをベイクすることは必須です。リアルタイムライトは非常に負荷が高いため、完全に排除することも決して不合理ではありません。ベイクされたライティングとライトプローブを最大限に活用してください。ライトマップの解像度は低く抑えましょう。ライトマップの解像度が低くても、ライティングを非常に綺麗に見せることは可能です。

オクルージョンカリング

このセクションはワールドにのみ適用されます。

オクルージョンカリングをベイクすることは極めて重要です。これを行うことで、ハードウェアは見えているものだけを描画し、見えないものを無視できるようになります。オクルージョンカリングの設定にはほとんど時間はかかりません。

これが、ワールド内でメッシュを過度に統合すべきではない理由でもあります。例えば、地面の上に建物を配置しているような場合、建物のメッシュを地面のメッシュと統合してしまうとカリングができなくなるため、統合は避けるべきです。

ボーン数

スキニング呼び出しのコストを抑えるには、ボーン数を少なく保つことが重要です。アニメーションやリグによって動かされていないボーンがある場合は、そのウェイトを親ボーンに統合し、元のボーンを削除してください。Cat's Blender Pluginのようなツールを使うと、この作業が非常に簡単になります。

リグの整合

スケール、回転、位置を含め、リグの基本的なボーンレイアウトと階層が同一であることを確認してください。これは特にルートボーン(通常はヒップボーン)に当てはまります。これらが一致していないと、クロスプラットフォームでコンテンツを閲覧する際に奇妙な挙動を引き起こす可能性があります。

シェーダー

Avatars

VRChatのAndroid版では、アバターに使用できるシェーダーが制限されています。VRChat SDKに含まれているVRChat Mobileシェーダーのみを使用してください。Androidでのアバター使用可能なシェーダー制限については、[Android Content Limitations]ページを参照してください。

これらのバリエーションについては、Android Content Limitationsページを参照してください。

アバターにノーマルマップがない場合は、Bumpedバリエーションを使用しないでください。効果がないばかりか、わずかながらパフォーマンスコストが発生します。Specularについても同様です。

Worlds

VRChatのAndroid版において、ワールドのシェーダーには制限がありません。ただし、カスタムシェーダーを作成・使用する際は細心の注意を払う必要があります。何よりもパフォーマンスを最優先してください。高度に最適化された基本的なワールド用シェーダーを探している場合は、Mobile/VRChat/Lightmappedを使用し、ライティングをベイクしてください。

透過処理は可能な限り避けるべきです。アルファフィルレートはモバイルGPUにとって大きなパフォーマンス低下要因となるため、設計段階で透過処理を必要としない構成を検討してください。

その他のコンポーネント

Cloth

VRChatのAndroid版では、Clothコンポーネントは完全に無効化されています。

Cameras

VRChatのAndroid版では、アバター上のカメラコンポーネントは無効化されています。

ワールド内では使用が許可されていますが、多用しすぎないよう注意してください。

Lights

VRChatのAndroid版では、アバター上のライトは完全に無効化されています。

ポストプロセッシング (v1およびv2)

VRChatのAndroid版では、ポストプロセッシングシステムは完全に無効化されています。

Audio Sources

VRChatのAndroid版では、アバター上のAudio Sourceは完全に無効化されています。

VRChatのAndroid版では、ワールド内のAudio Sourceは制限されています。

Rigidbody、Collider、Joint

VRChatのAndroid版では、アバター上のRigidbody、Collider、Jointは完全に無効化されています。

ワールド内ではこれらを使用できますが、過度に使用しないよう注意してください。

Particles

VRChatのAndroid版では、アバター上のパーティクルは大幅に制限されています。

最終更新: