アバターはできるだけ軽くしたいものですが、重くなってしまうことがあります。
好きな姿になりたいもの。いろいろなものを積みたいのは分かります。
しかし必要のないもののせいで重くなるのは不本意です。
イントロダクション
ここではアバターの最終ビルドサイズを小さくすることを主観点とします。
アバターが重くなる原因はさまざまであり、容量が小さいから軽いとも限りません。
特に、Oculus Questスタンドアロン環境向けのアバターには最終ビルドサイズ(アセットバンドルサイズ)が10MBの絶対的上限があります。10MBを超えてしまうとアバターをアップロードできません。
Oculus Quest向けビルドで10MBを超えた場合、上記のエラーメッセージが表示されアバターをアップロードできません。
【追記】2024/3/15
ダウンロードサイズおよび展開後のサイズ(テクスチャメモリ)について、PC向けビルドでも絶対的上限が適用されることとなりました。
2024/7/16を目途に適用されるため、上限を超えている場合は軽量化を実施する必要があります。これによる影響はアバターの2%程度にあるとされています。
現在の上限値
プラットフォーム | ビルド後(圧縮時) | 展開時 |
Windows(PC) | 500MB | 1.2GB |
Android(Quest) | 10MB | なし |
7月16日以降に適用される予定の上限値
プラットフォーム | ビルド後(圧縮時) | 展開時 |
Windows(PC) | 200MB | 500MB |
Android(Quest) | 10MB | 40MB 1 |
【追記】2022/10/29
ダウンロードサイズだけではなく、VRAMの使用量も重要な指標と見られつつあります。
すべてが同じ対策とは限りませんが、ダウンロードサイズの削減と共通する部分も多くあります。
最適化は、まず無駄なものを洗い出してから
あちこちで様々な最適化のテクニックがありますが、まず第一にとても重要なことがあります。
無駄なものを積まないことです。
この「無駄なもの」にはアバターやワールドの表現上必要なものは含みません。
表現上必要で積まなければならないものは仕方ありませんが、明らかに使用していないものが原因で重くなっているのであれば不本意です。
無駄を削減することで、アバターやワールドの品質を低下させずに容量を減らすことが簡単にできます。
また、容量を減らした分だけ積み込めるものが増え、アバターやワールドの作品としてのクオリティを向上させられるかもしれません。
なお、この方法はVRChatに限らずUnity全般としても当てはまります。
計測する
何がともあれ、まずは何が原因で重くなっているのかを測定しなければ始まりません。
ビルドを行った時、出力されるアセットバンドルに何が含まれたか、何が容量を占有しているかを表示できるパッケージが用意されています。
Unityエディタを起動し、Window→Package Managerを選択します。
左上でUnity Registryをクリックし、AdvancedでShow preview packagesにチェックします。
Build Report Inspectorを選択し、Installをクリックしてください。
使い方
VRChat SDKでBuild&TestまたはBuild&Publish for Android、 Build&Publish for Windowsをクリックします。
クリックした後、Window→Open Last build reportをクリックします。アバターやワールドのアップロードを実行する必要はありません。
Inspectorに最後に実行されたビルドの情報が表示され、具体的に何のファイルがどれだけの容量を占有したかを視覚的に確認できます。
この情報はアセットフォルダ直下のBuildReportsフォルダに保存され、後で確認することができます。
容量を占有しやすいアセットと占有しにくいアセットについて
オーディオファイル、テクスチャは特に大きな容量を占有する可能性があります。
モデルデータは場合により変動します。
Animator ControllerやAnimationファイル、シェーダー、マテリアルはほとんど占有しません。
これらはアセットフォルダ内ではテキストファイルで保存されているため、実際にアセットバンドルに格納される場合は圧縮されて無視できるほどまで小さくなるためです。
不要なものを積まない
使っていないものはビルドから取り除きましょう。使っていないのにビルドに含めていると容量の無駄となります。
Tag: EditorOnly
GameObjectにEditorOnlyを指定した場合、そのGameObjectはビルドに含まれなくなります。
テスト用に作成したり、アバターの改変を行う過程で不要となったメッシュやテクスチャを最終ビルドに含めないようにすることができます。
EditorOnlyが指定されているとき、そのGameObjectはエディタ内では表示されますが、最終的なアバターに含まれることはありません。
テクスチャの共用
マテリアルを複数使用する場合、できるだけテクスチャを共有してください。
アバター改変の時に起こりがちですが、マテリアルをコピーして入れ替えることがあります。
このとき、同じテクスチャを使用しているすべてのマテリアルに対して同じ操作を行ってください。
UV上異なる箇所を読み込んでいても、この操作を行わなければ改変前と改変後の2枚のテクスチャがビルドに含まれることになります。
アバターによっては複数のマテリアルで1つのテクスチャを共有していることがあります。
1つのテクスチャをもとに、シェーダーの設定値のみを変更して表現する場合があります。
そのような場合に対応を行うと、必要のないテクスチャによる容量を減らすことができます。
目立たない場所の品質を低下させる
あまり目立たない場所について、品質を犠牲にすることで容量を削減することができます。
多くの人はアバターの装備品よりもそのアバター本人を見ることが多いはずです。
人間が会話するとき、大抵は顔を見ながら話すはずで、それ以外の場所を見ながら話す人は少ないでしょう。
VRChatでは鏡を見ながら話す文化がありますが、その場合でも考え方は同じです。
Unityアセットストアから持ち込んだアセットでは以下の施策が適用されていないことがあります。この操作をすることで大きく容量を削減できる余地が残されています。
目立たない場所のテクスチャサイズを小さくする
人が良く見るアバターの顔に多くの容量を割り当て、他の場所は小さくすることができます。
テクスチャを選択し、Inspectorを確認します。
下方にあるMax Sizeを適当な大きさまで小さくします。
このサイズを小さくすることで、アセットバンドルに含まれるテクスチャの容量を大きく削減できます。必要以上に小さくすると画質が粗くなりますのでご注意ください。
テクスチャの容量はここで指定したMax Sizeの2乗に比例して変化します。
Max Sizeは2のべき乗で指定できますので、1段階下げるごとにテクスチャの容量は1/4になります。
逆に1段階上げるごとに、テクスチャの容量は4倍となります。
また、CompressionをLow Qualityに変更することでテクスチャの品質を下げる代わりに、容量をある程度削減することも可能です。
【非推奨となりました】<PCのみ>Use Crunch Compression
【追記】2024/3/15
Crunch Compression(クランチ圧縮)の使用は非推奨となりました。使用する場合は、以下の点を考慮してください。
メリット: アバターのダウンロードサイズを削減することには役立ちます。
注意点: 展開後のサイズを削減する効果はありません。Crunch Compressionを使用しなくても、ビルド時にはある程度の圧縮が適用されています。
デメリット: Crunch Compressionが適用されたテクスチャを解凍する際(アバターの読み込み完了時)、一時的にCPU負荷が高まる可能性があります。また、テクスチャの画質が劣化する場合があります。
テクスチャに対して非可逆圧縮を行います。
わずかに品質が低下しますが、テクスチャの容量を数分の1まで削減することができます。
上記画面で、Use Crunch Compressionにチェックをします。
Compression Qualityを調整します。数字を大きくするほど品質を保てますが、圧縮効果が低下します。
なお、Oculus Questスタンドアロン環境ではCrunch Compressionによる容量削減効果はありません。
<Questのみ>ASTC圧縮を使用する
テクスチャの圧縮形式をASTCに変更することで、高い圧縮率を期待できます。
Quest版VRChatが利用できる端末は決まっており、そのすべてがASTC圧縮に対応しているため変更することによるデメリットはありません。
なお、VRCQuestToolsによってQuest対応化を行った場合は、初回設定にてASTC圧縮を使用するよう促されます。
余分なAnimationの削除
PC版のアバターからQuest版を生成する場合、一部のギミックを削除することがあります。
削除したギミック用のAnimationが残っているとそれもビルドに含まれてしまい、無駄に容量を消費することになります。
Animator Controllerから不必要なレイヤーを削除することで、容量の削減を図ることができます。
ただし、レイヤーを削除するとレイヤーの階層が変更されるため、階層を指定しているコンポーネントがある場合はご注意ください。
一般的に推奨される容量の削減方法について
VRChatの運営チームにより、一般的に推奨される容量の削減方法、避けるべき方法が公開されています。
大原則: 1つのアバターにすべてを詰め込もうとしないでください。
- テクスチャのサイズを可能な限り小さくし、枚数も減らしてください。
- テクスチャのサイズは2048以内にしてください。テクスチャのサイズを1段階引き上げるごとに容量は4倍になります。
- 長時間のオーディオファイルを含めないでください。
- キーフレームを全体に指定したアニメーションを使用しないでください。
- 1つのBlueprintのアバターに対して複数のアバターを詰め込まないでください。
- アバターに複数の着替えを実装する場合は、それぞれ別々のBlueprintのアバターとしてアップロードしてください。
- Quest版のテクスチャサイズ上限は近日中(バージョン2024.1.2以降)に適用予定。 ↩︎