パソコンに映像を描画するための部品の1つとして、ビデオメモリがあります。
video RAM、通称VRAMとして呼ばれます。最近、VRChatではこのVRAMについてパフォーマンス上、重要な指標として見るようになりつつあります。
VRAMは何に使われる?
映像を描画するにはテクスチャ、メッシュ、シェーダーなど、様々なデータを読み込む必要があります。
これは2Dでも3Dでも変わりませんが、ここではVRChatでの話ですので3Dに限定します。
テクスチャやメッシュは描画に必須なデータです。つまり、素早く取り出して描画しなければなりません。そのため、VRAM上に展開しておく必要があります。
VRAMは2種類あり、専用ビデオメモリと、メインメモリの一部を利用する共有ビデオメモリがあります。
専用ビデオメモリと共有ビデオメモリの使用量は、Windows10以降であればタスクマネージャーからGPUごとに確認することができます。
専用ビデオメモリ
グラフィックボードに搭載されているビデオメモリのことです。
直接搭載されているので、GPUから極めて高速にアクセスできます。
下の画像ではDedicated GPU memoryと表示されています。
ただし、容量に限りがあります。また、グラフィックボードに直接搭載されているので後から増設することはできません。
専用ビデオメモリを増やしたい場合は、グラフィックボード自体の交換または増設が必要です。
VRChatでは、今現在目に見えているGameObjectで使われているテクスチャやメッシュが専用ビデオメモリに読み込まれます。
共有ビデオメモリ
パソコンに搭載した物理メモリの一部をビデオメモリとして使用するものです。
グラフィックボードに直接搭載されているわけではないので、専用ビデオメモリに比べてパフォーマンスは劣ります。
下の画面ではShared GPU memoryと表示されています。
この共有ビデオメモリは一般的に、物理メモリの半分程度までを使用するように設定されています。
VRChatでは、専用物理メモリの容量が不足した場合、目に見えていないGameObjectは共有ビデオメモリに退避されることがあります。
専用ビデオメモリが不足すると何が起きますか?
VRアプリケーションは極めて高い描画能力を要求するため、専用ビデオメモリが不足すると極端にパフォーマンスが低下します。
場合によってはアプリケーション(VRChatやSteamVR)が強制終了することもあります。
共有ビデオメモリへのアクセスが増加するため、フレームレートの極度な低下として症状が発現します。
人の多い場所から視界を外すことで共有ビデオメモリに退避されるため、一時的に症状が改善します。
VRAM使用量を削減、最適化するには?
一般プレイヤーとして見るか、開発者として見るかによって対策は変化します。
一般プレイヤーの場合
ソフトウェアレベルでの対応
まず、VRChat以外で使用していないプログラムを閉じてください。
Unity Editorで作業しながらVRChatに入る場合、EditorそのものがVRAMを多く使用するためVRChatのパフォーマンス低下の原因となります。
それでも専用ビデオメモリの容量が不足する場合、極端に重いと思われるアバターをHide Avatarするか、Hide Avatar by Distanceにより一定距離よりも遠いアバターを非表示にすることで対応できます。
または、Safety設定によりアバターを非表示にし、Show Avatarを行うことで見たいアバターだけを表示するようにします。
もしくは、設定でMaximum Avatar Download Sizeを変更することでダウンロードサイズの大きなアバターを読み込まないようにすることができます。
ハードウェアレベルでの対応
モニターが大量に接続されている場合は、使用しないモニターを取り外してください。これは節電にも役立ちます。
グラフィックボードが複数搭載されている場合は、HMDとモニターで別々のグラフィックボードに接続すると使用するVRAMをHMDに割り当てやすくなります。
もちろん、HMDで使用するグラフィックボードを高性能なものに接続するようにしてください。
必要に応じて、CPU内蔵グラフィックスを活用して、HMDにより多くのVRAMや3D性能を割り当てる工夫も可能です。
ただし、CPU内蔵グラフィックスの性能によっては逆効果となることがあります。
また、CPU内蔵グラフィックスのないCPUではこの方法は使用できません(具体的には、Intel CPUで型番の末尾がFとなっているCPUでは、この方法を使用することができません)。
パソコン上で開いているVRChat以外のプログラムもVRAMを使用しますが、グラフィックボードを分けることでそれらの影響を軽減することができます。
開発者の場合
アバターをアップロードする開発者の方の場合は、VRAMの使用量に気を配る必要があります。
VRAMはアバターとワールドの合計で使われますので、アバターのVRAMの使用量が多すぎる場合、人数の多いインスタンスでは専用VRAM不足に陥るおそれがあります。
VRAM Calculator(VRAM Checker)のように、アバターが使用するVRAMの使用量を計測することができる便利なツールがあります。
ノーマルマップやシェードマップなど、複数のテクスチャを使用するマテリアルの場合はVRAMの使用量が増えやすくなります。
VRAMの使用量を減らすには?
ほとんどの場合で、テクスチャの解像度を下げることでVRAMの使用量を削減することができます。
理論的には、テクスチャの解像度(1辺のピクセル数)を半分にすれば1/4に削減されます。逆に、2倍にすると4倍になります。
テクスチャのMax Sizeを支障のない範囲で変更することで、パフォーマンスの改善に役立ちます。
タブがあることにお気づきかもしれませんが、この設定はプラットフォーム単位で変更できます。
PCはWindowsプラットフォーム、QuestはAndroidプラットフォームですので、このタブを使って調節することで1枚のテクスチャでPCとQuestで異なるMax Sizeを設定することができます。
クランチ圧縮は?
効果は限定的とされています。
ダウンロードサイズは削減されますが、VRAM上に展開されるときの削減効果はないといわれています。
まったく行う意味がないわけではありません。ダウンロードサイズを大きく削減する効果はあります。
回線速度の遅いプレイヤーに対する配慮としては有効です。
また、クランチ圧縮を行う開発者のPCでは高い負荷と長い時間がかかりますが、解凍は高速に行えるとされています。
DXT1/DXT5圧縮がVRAMにそのまま乗るは合ってるんだけど、Crunch圧縮した場合は、ロード時にCPUが元のDXT1/DXT5形式に(非可逆で)解凍してからVRAMに乗せるので、データのダウンロード容量は減るけどVRAMの使用量は減ってない事に注意
— みみー (@mimyquality) March 7, 2022
解像度を下げて容量を減らした場合はそのままの容量でVRAMに乗る https://t.co/nxtrqK4fbN
VRAM消費量削減に効果があるもの
— lil (@lil_xyzw) October 21, 2022
– CompressionをNoneにしない
– テクスチャ解像度を下げる
– (頂点シェーダーで使うテクスチャのみ)ミップマップをオフにする
効果が無いもの
– Crunch Compression
場合によっては逆効果になるもの
– アトラス化
クランチ圧縮は、テクスチャのディスク使用量を可能な限り少なくしますが、ランタイムのメモリ使用量には影響しません。クランチテクスチャの圧縮には時間がかかりますが、ランタイムでの解凍はかなり高速です。クランチ圧縮の非可逆性を調整することで、ファイルサイズと品質のバランスを取ることができます。
GameObjectの非表示は?
専用ビデオメモリの使用量を削減する観点から見れば、一定の効果はあります。
いずれかのActiveな(チェックのついた)GameObjectから参照されているテクスチャは専用ビデオメモリに読み込まれますが、すべてのInactiveな(チェックのついていない)GameObjectから参照されているテクスチャは共有ビデオメモリに退避されます。
アバターに多数のアイテムを装備している場合は、一部を非表示にするとパフォーマンスが改善することがあります。
ただし、共有ビデオメモリに退避されているだけですので各プレイヤーの物理メモリは使用していることに注意してください。
そのため、使う予定のないGameObjectやテクスチャは削除するか、TagをEditorOnlyにしてビルドに含めないようにすることをおすすめします。