専用ビデオメモリと共有ビデオメモリはVRChatでどのように使われるか

この記事は約8分で読めます。

パソコンに映像を描画するための部品の1つとして、ビデオメモリがあります。

video RAM、通称VRAMとして呼ばれます。最近、VRChatではこのVRAMについてパフォーマンス上、重要な指標として見るようになりつつあります。

VRAMは何に使われる?

映像を描画するにはテクスチャ、メッシュ、シェーダーなど、様々なデータを読み込む必要があります。
これは2Dでも3Dでも変わりませんが、ここではVRChatでの話ですので3Dに限定します。

テクスチャやメッシュは描画に必須なデータです。つまり、素早く取り出して描画しなければなりません。そのため、VRAM上に展開しておく必要があります。

VRAMは2種類あり、専用ビデオメモリと、メインメモリの一部を利用する共有ビデオメモリがあります。

専用ビデオメモリと共有ビデオメモリの使用量は、Windows10以降であればタスクマネージャーからGPUごとに確認することができます。

専用ビデオメモリ

グラフィックボードに搭載されているビデオメモリのことです。
直接搭載されているので、GPUから極めて高速にアクセスできます。

GPUに書かれたメモリ容量は、一般的にこの専用ビデオメモリのことを指します。

下の画像ではDedicated GPU memoryと表示されています。

ただし、容量に限りがあります。また、グラフィックボードに直接搭載されているので後から増設することはできません。
専用ビデオメモリを増やしたい場合は、グラフィックボード自体の交換または増設が必要です。

VRChatでは、今現在目に見えているGameObjectで使われているテクスチャやメッシュが専用ビデオメモリに読み込まれます。

VRAM使用率の高いテクスチャやメッシュを含むGameObjectをアクティブにする場合、その操作により共有ビデオメモリから専用ビデオメモリへのテクスチャやメッシュのロードが発生する場合があります。
自分自身及び他プレイヤーにパフォーマンス上の影響を与える可能性がありますので、ご注意ください。

共有ビデオメモリ

パソコンに搭載した物理メモリの一部をビデオメモリとして使用するものです。
グラフィックボードに直接搭載されているわけではないので、専用ビデオメモリに比べてパフォーマンスは劣ります。

下の画面ではShared GPU memoryと表示されています。

この共有ビデオメモリは一般的に、物理メモリの半分程度までを使用するように設定されています。

VRChatでは、専用物理メモリの容量が不足した場合、目に見えていないGameObjectは共有ビデオメモリに退避されることがあります。

目に見えていない非アクティブなGameObjectすべてが共有ビデオメモリに退避されるとは限りません。
専用ビデオメモリの容量が潤沢にある場合は、退避されない場合もあります。

一部のパソコンでは共有ビデオメモリだけ搭載していることがあります。
通常の事務作業程度では高度な描画能力を必要としないため、あえて共有ビデオメモリだけを使うパソコンもあります。

専用ビデオメモリが不足すると何が起きますか?

VRアプリケーションは極めて高い描画能力を要求するため、専用ビデオメモリが不足すると極端にパフォーマンスが低下します。
場合によってはアプリケーション(VRChatやSteamVR)が強制終了することもあります。

共有ビデオメモリへのアクセスが増加するため、フレームレートの極度な低下として症状が発現します。

人の多い場所から視界を外すことで共有ビデオメモリに退避されるため、一時的に症状が改善します。

VRAM使用量を削減、最適化するには?

一般プレイヤーとして見るか、開発者として見るかによって対策は変化します。

一般プレイヤーの場合

ソフトウェアレベルでの対応

まず、VRChat以外で使用していないプログラムを閉じてください。
Unity Editorで作業しながらVRChatに入る場合、EditorそのものがVRAMを多く使用するためVRChatのパフォーマンス低下の原因となります。

それでも専用ビデオメモリの容量が不足する場合、極端に重いと思われるアバターをHide Avatarするか、Hide Avatar by Distanceにより一定距離よりも遠いアバターを非表示にすることで対応できます。

Developer Update - 4 August 2022
Hello! Welcome to the latest VRChat Developer Update. Here’s what we were up to today. Check out our Dev Update from yes...

または、Safety設定によりアバターを非表示にし、Show Avatarを行うことで見たいアバターだけを表示するようにします。

もしくは、設定でMaximum Avatar Download Sizeを変更することでダウンロードサイズの大きなアバターを読み込まないようにすることができます。

ダウンロードサイズとVRAMの使用量は異なります。
一般的にダウンロードサイズが大きい場合に重くなる傾向にありますが、VRAMを大量に使用するとは限りません。その逆も同様です。

ハードウェアレベルでの対応

モニターが大量に接続されている場合は、使用しないモニターを取り外してください。これは節電にも役立ちます。

グラフィックボードが複数搭載されている場合は、HMDとモニターで別々のグラフィックボードに接続すると使用するVRAMをHMDに割り当てやすくなります。
もちろん、HMDで使用するグラフィックボードを高性能なものに接続するようにしてください。

必要に応じて、CPU内蔵グラフィックスを活用して、HMDにより多くのVRAMや3D性能を割り当てる工夫も可能です。
ただし、CPU内蔵グラフィックスの性能によっては逆効果となることがあります。
また、CPU内蔵グラフィックスのないCPUではこの方法は使用できません(具体的には、Intel CPUで型番の末尾がFとなっているCPUでは、この方法を使用することができません)。

パソコン上で開いているVRChat以外のプログラムもVRAMを使用しますが、グラフィックボードを分けることでそれらの影響を軽減することができます。

開発者の場合

アバターをアップロードする開発者の方の場合は、VRAMの使用量に気を配る必要があります。

VRAMはアバターとワールドの合計で使われますので、アバターのVRAMの使用量が多すぎる場合、人数の多いインスタンスでは専用VRAM不足に陥るおそれがあります。

たとえば、ワールドが1GBのVRAMを使用し、アバターが1体あたり平均100MBのVRAMを使用し、40人いる状態ではおよそ5GBのVRAMを使用することになります。

VRAM Calculator(VRAM Checker)のように、アバターが使用するVRAMの使用量を計測することができる便利なツールがあります。

GitHub - Thryrallo/VRC-Avatar-Performance-Tools
Contribute to Thryrallo/VRC-Avatar-Performance-Tools development by creating an account on GitHub.

ノーマルマップやシェードマップなど、複数のテクスチャを使用するマテリアルの場合はVRAMの使用量が増えやすくなります。

VRAMの使用量を減らすには?

ほとんどの場合で、テクスチャの解像度を下げることでVRAMの使用量を削減することができます。
理論的には、テクスチャの解像度(1辺のピクセル数)を半分にすれば1/4に削減されます。逆に、2倍にすると4倍になります。

テクスチャのMax Sizeを支障のない範囲で変更することで、パフォーマンスの改善に役立ちます。
タブがあることにお気づきかもしれませんが、この設定はプラットフォーム単位で変更できます。

PCはWindowsプラットフォーム、QuestはAndroidプラットフォームですので、このタブを使って調節することで1枚のテクスチャでPCとQuestで異なるMax Sizeを設定することができます。

クランチ圧縮は?

効果は限定的とされています。
ダウンロードサイズは削減されますが、VRAM上に展開されるときの削減効果はないといわれています。

まったく行う意味がないわけではありません。ダウンロードサイズを大きく削減する効果はあります。
回線速度の遅いプレイヤーに対する配慮としては有効です。

また、クランチ圧縮を行う開発者のPCでは高い負荷と長い時間がかかりますが、解凍は高速に行えるとされています。

テクスチャ圧縮形式 - Unity マニュアル
Unity エディターでは、JPEG や PNG などの一般的な形式のテクスチャソースファイルを読み込むことができます。しかし、GPU はこれらの形式をランタイムには使用しません。GPU は、メモリ使用量とサンプリング処理の速度に最適な、異...

クランチ圧縮は、テクスチャのディスク使用量を可能な限り少なくしますが、ランタイムのメモリ使用量には影響しません。クランチテクスチャの圧縮には時間がかかりますが、ランタイムでの解凍はかなり高速です。クランチ圧縮の非可逆性を調整することで、ファイルサイズと品質のバランスを取ることができます。

GameObjectの非表示は?

専用ビデオメモリの使用量を削減する観点から見れば、一定の効果はあります。

いずれかのActiveな(チェックのついた)GameObjectから参照されているテクスチャは専用ビデオメモリに読み込まれますが、すべてのInactiveな(チェックのついていない)GameObjectから参照されているテクスチャは共有ビデオメモリに退避されます。

アバターに多数のアイテムを装備している場合は、一部を非表示にするとパフォーマンスが改善することがあります。

ただし、共有ビデオメモリに退避されているだけですので各プレイヤーの物理メモリは使用していることに注意してください。

そのため、使う予定のないGameObjectやテクスチャは削除するか、TagをEditorOnlyにしてビルドに含めないようにすることをおすすめします。

タイトルとURLをコピーしました