Android Content Optimization
Android版VRChat向けのコンテンツ制作には課題があります。モバイルデバイス向けに最適化を維持しつつ、魅力的で引き込まれるコンテンツを作成しなければならないためです。これは、モバイル向けゲーム開発者が直面するものと同じ課題です。
ここでは、Android版VRChat向けのコンテンツを構築する際に留意すべき一般的なガイドラインを紹介します。
以下の項目は、特に断りがない限り、アバターとワールドの両方に適用されます。
Unityが提供するOptimizing your VR/AR Experiencesのガイドには、非常に有益なポイントが多くまとめられています。
また、Lucas RizzottoによるVRコンテンツの最適化に関する優れた動画も参考にしてください。非常によくまとめられており、ここで扱う内容の多くを網羅しています。この動画はVRChatによって、あるいはVRChat専用に作成されたものではありません。あらかじめお伝えしておきますが、過激な表現が含まれています。 この記事にある項目の多くは、この動画でも取り上げられています。
最後に、このリストに記載されているすべての項目は変更される可能性があることに留意してください。言い換えれば、制限事項や推奨事項はまだ完全に確定したわけではないため、その点をご承知おきください。
制限の適用
VRChatのAndroid版には、アバターのコンテンツに関するいくつかのハードリミット(およびソフトリミット)が存在します。詳細についてはAndroid Content Limitationsを確認してください。また、ブロック機能の仕組みに関する詳細はAvatar Performance Ranking Systemのページをご覧ください。
推奨値を大幅に超えるアバターを含むアバターやアバターワールドをアップロードした場合、そのワールドやアバターは公開停止となる可能性があります。
Unity Profiler
Unity Profiler を必ず確認することを強く推奨します。プロファイラーを使用することで、ワールドやアバターのさまざまなパフォーマンス指標を正確な数値として定量化できます。特に、シーン内のドローコール数や、各コンポーネントがフレーム時間に占める割合などは非常に重要です。
もちろん、高性能なPC上のプロファイラーの結果は、Android上のプロファイラーの結果とは異なりますが、それでも「Xというコンポーネントがレンダリングよりも大幅に多くのフレーム時間を使用している」といった状況を把握することは可能です。すべては相対的なものなのです!
Unity Profilerの使い方は多くのチュートリアルで解説されており、Unity公式の Profiler Overview for Beginners や、中級者向けの Introduction to the Profiler などがあります。これらのチュートリアルは古いバージョンのUnity向けに作成されていますが、基本的な概念を理解するには十分役立ちます。
ファイルサイズ
モバイルプラットフォームではメモリ容量が限られているため、常にその点を意識することが非常に重要です。アセットのサイズは、コンテンツをビルドした後(SDKの「Build & Publish」ボタンを押した後)、Editorログで「statistics」という単語を検索することで確認できます。このとき、圧縮前のサイズを確認するようにしてください。
経験則として、大きなテクスチャ(1kを超えるもの)の使用は避けてください。これらはメモリ消費量を増やす主な原因となります。頂点カラーやフラットカラーを活用することは、テクスチャサイズの削減に非常に効果的です。
なお、Crunch圧縮はメモリ内のサイズ削減には効果がないことに注意してください!Crunch圧縮はダウンロードサイズの削減にのみ有効です。コンテンツパッケージは、Crunch圧縮に頼ることなく制限内に収まるようにしてください。
ワールド
Android版VRChat向けに、ビルド時の圧縮後サイズが100MBを超えるワールドをアップロードしたり、アクセスしたりすることはできません。
アバター
アバターは最大でも5~8 MB以内に収めることを目指してください。Android版VRChat向けに、ビルド時の圧縮後サイズが10MBを超えるアバターをアップロードしたり、着用・表示したりすることはできません。
三角形の数(Triangle Count)
モバイルプラットフォームでは、三角形の数を低く抑えることが非常に重要です。モバイルヘッドセットとしては高性能なQuestであっても、ハードウェアの制限は存在します。高いパフォーマンスを維持するためには、三角形の数を常に意識することが欠かせません。
これらの推奨事項は、アバターパフォーマンスランクシステムを通じて技術的に適用されます。
ワールド
ワールドを制作する際は、三角形の数を低く抑えるように努めてください。ユーザーのアバターが表示される分の余裕を残しておく必要があります。ワールド全体の三角形の数は、合計でおよそ250,000以内に収めることを推奨します。
アバター
ワールドと同様の原則がアバターにも当てはまります。同じ部屋に10人以上のユーザーが滞在する可能性があることを念頭に置き、三角形の使用量を厳しく制限してください。アバターの三角形の数は、10,000未満を目指すことを推奨します。
これは、自身でアバターを作成するのではなく、さまざまなソースからキャラクターをインポートすることを好むアバター制作者にとっては課題となるでしょう。このレベルまでポリゴンを削減(デシメーション)すると形状が崩れる可能性があるため、ポリゴン数を低く維持するためにリトポロジーといった手法の検討が必要になるかもしれません。
メッシュ数
これはワールドとアバターの両方に適用されます。
どのツールを使用する場合でも、コンテンツ内で使用するメッシュの数は制限する必要があります。ワールド内の静的オブジェクトについては(オクルージョンカリングが必要なため)それほど重要ではありませんが、アバターにおいては非常に重要です。
アバターには Skinned Mesh Renderer を1つだけ使用するようにしてください。アクセサリーや追加パーツは、Blenderなどの3D編集ソフトを使用して元のメッシュに結合してください。アニメーションや動きは、シェイプキーやボーンを介して処理する必要があります。
VRChatのQuest対応アバターには、近い将来、厳格なメッシュ数制限が設けられる予定です。
ワールド制作においては、ワールド内の「オブジェクト」という単位で考える必要があります。地面に置かれた一式の壺は単一のオブジェクトとして扱うことができますが、その一式の壺を地面のメッシュと結合させることは推奨されません。結合してしまうと、さまざまな最適化の問題が発生するだけでなく、後からワールドを編集するのが困難になる可能性があります。
マテリアル
アバター、ワールドを問わず、マテリアル数を削減することは非常に重要です。マテリアルを追加するとサブメッシュも追加され、ドローコール(描画呼び出し)の負荷が増加します。ビューポートの描画に必要なドローコール数を減らすことは、最適化において極めて重要です。
ワールド
ワールドのマテリアル数は、可能な限り少なくなるよう目指してください。とはいえ、ワールドに関してはアバターほど厳密である必要はありません。ワールドはオブジェクトの集合体であると考え、それに応じてマテリアルを統合するのがベストです。
例えば、ビーチのシーンであれば、椅子、パラソル、タオルは1つのテクスチャアトラスと1つのマテリアルにまとめるのが適切です。少し離れた場所にある岩のセットは、別のマテリアルとテクスチャにするとよいでしょう。そうすることで、オクルージョンカリング(遮蔽カリング)のためにオブジェクトを分離することが可能になります。
ワールドにおいてマテリアルの結合やアトラス化を過度に行いすぎると、Unityのバッチ処理や実行時の最適化において、かえって非効率な挙動を引き起こす可能性があります。
アバター
アバターのマテリアル数は1つを目指すべきですが、異なるシェーダーバリアントが必要な場合に限り、2つまでであれば許容される場合があります。テクスチャのアトラス化は不可欠です。
VRChatのQuest版アバターについては、近い将来、厳格なマテリアル制限が設けられる予定です。
アバターとワールド
すべてのマテリアルにおいて GPU Instancing を有効にしてください。実際の利用ケースはより複雑で技術的なものですが、基本的にはオンにしておくのが最善です。
テクスチャ
テクスチャサイズに関する懸念は、アバターとワールドの両方に等しく当てはまりますが、アバターのテクスチャサイズは小さく抑える必要があることに留意してください。1つのインスタンスには複数のアバターが存在しますが、ワールドは1つしか読み込まれないためです。
テクスチャサイズを小さく保つことは重要です。最大でも 1k (1024x1024) 解像度のテクスチャを使用することを目指してください。また、効率的にパッキングされたアトラスを作成することで、同じサイズでより高いテクスチャ解像度を実現できます。
アバターは圧縮後のサイズが 10MB を超えてはならず、ワールドは圧縮後のサイズが 100MB を超えてはなりません。データ容量の大部分は通常テクスチャデータが占めるため、テクスチャを小さく保ち、適切に圧縮を行うようにしてください。
Crunch 圧縮の使用を検討しても良いですが、将来的に新しい Unity バージョンが採用された際、互換性のないバージョンの Crunch が使用されると、アバターが正しく表示されなくなる可能性がある点に注意してください。
ライティング
このセクションはワールドのみに適用されます。
ワールドのライティングをベイクすることは必須です。リアルタイムライトは非常に負荷が高いため、完全にオフにしても問題ありません。ベイクされたライティングとライトプローブを積極的に活用してください。ライトマップの解像度は低く抑えましょう。ライトマップの解像度が低くても、ライティングを非常に美しく見せることは可能です。
Occlusion Culling(オクルージョンカリング)
このセクションはワールドにのみ適用されます。
Occlusion Culling のベイクは非常に重要です。これを行うことで、ハードウェアは必要なものだけをレンダリングし、見えないものを無視できるようになります。Occlusion Culling の設定にはそれほど時間はかかりません。
これが、ワールド内のメッシュを過度に統合すべきではない理由でもあります。例えば、地面の上に建物を配置するような場合、建物のメッシュを地面のメッシュと統合してしまうと、建物だけをカリング(描画除外)することができなくなってしまうため、これらを分けることが推奨されます。
ボーン数
スキン処理の呼び出しコストを抑えるには、ボーン数を少なく保つことが重要です。アニメーションやリグによって動かされていないボーンがある場合は、そのウェイトを親ボーンに統合し、元のボーンを削除してください。Cat's Blender Plugin のようなツールを使用すると、この作業を非常に簡単に行うことができます。
使用するリグの基本的なボーン配置と階層構造(スケール、回転、位置を含む)が一致していることを確認してください。これは特にルートボーン(通常は腰のボーン)において重要です。これらが一致していないと、クロスプラットフォームでコンテンツを閲覧する際に奇妙な挙動が発生する可能性があります。
シェーダー
アバター
VRChatのAndroid版では、アバターに使用できるシェーダーが制限されており、VRChat SDKに含まれる VRChat Mobile シェーダーのみを使用できます。
これらのバリエーションに関する詳細は、Android Content Limitations のページで確認してください。
アバターにノーマルマップを使用していない場合は、Bumped バリエーションを使用しないでください。効果がないだけでなく、パフォーマンスがわずかに低下します。Specular も同様です。
ワールド
VRChatのAndroid版では、ワールドにおけるシェーダーの制限はありません。ただし、カスタムシェーダーを作成・使用する際は 細心の注意 を払う必要があります。何よりもパフォーマンスを優先してください。高度に最適化された基本的なワールド用シェーダーを探している場合は、Mobile/VRChat/Lightmapped を使用し、ライティングをベイクしてください。
透明度を使用することは極力避けてください。アルファフィルレートはモバイルGPUにとって大きなパフォーマンス低下の原因となるため、可能な限り透明度を使わない設計を心がけてください。
その他のコンポーネント
Cloth
Android版VRChatでは、Clothコンポーネントは完全に無効化されます。
Cameras
Android版VRChatのアバターにおいて、Cameraコンポーネントは無効化されます。
ワールド内では使用可能ですが、使いすぎには注意してください。
Lights
Android版VRChatのアバターにおいて、Lightコンポーネントは完全に無効化されます。
Post Processing (v1 and v2)
Android版VRChatでは、ポストプロセッシングシステムは完全に無効化されます。
Audio Sources
Android版VRChatのアバターにおいて、AudioSourceコンポーネントは完全に無効化されます。
Android版VRChatのワールド内では、AudioSourceの使用は制限されています。
Rigidbodies, Colliders, and Joints
Android版VRChatのアバターにおいて、Rigidbody、Collider、およびJointコンポーネントは完全に無効化されます。
ワールド内では使用可能ですが、使いすぎには注意してください。
Particles
Android版VRChatのアバターにおいて、パーティクルは大幅に制限されます。
最終更新: