Skyrim箱庭DIY

MODによる固有の環境不具合は自分で直して快適ゲーム。CTDにさようなら。Do It Yourself!!

【Skyrim】ReservedMemorySizeMbとVideoMemorySizeMbの構造と動作確認実験



スポンサーリンク

enblocal.iniの重要な設定項目、ReservedMemorySizeMBとVideoMemorySizeMbに関しての話です。Boris氏のコメントを拾い集めて、それを元にした僕の解釈の上で、色々実験してみました。

この記事もあくまで僕の理解でしかないので、これが正しいという保障は無いです。その前提でお願いします。

関連記事

※ENBoost関連の構造的な詳細ドキュメントが無いので、知りたければ掲示板からBoris氏のコメントを拾い集めるしか無いと思います。とはいえ使い方はとても丁寧に説明されているので(個人のenblocal.iniの設定に関する投稿でも、細かくアドバイスしてくれる程の親切っぷり)、使う上で困ることは無いと思いますが。

ReservedMemorySizeMbとVideoMemorySizeMbの構造に関しては未だに結構錯綜してるようで、質問の書き込みが多く見られます。

ちなみにSTEPのENB関連まとめには、Boris氏は一切関与してないようです。

enbseries.enbdev.com

多分ロシアの人ですかね?時々ロシア語の投稿もありますが、基本は英語です。バージョンアップに伴う新機能の説明とかは、ここで書かれてます。

これだけごっつい人が650TiでSkyrimやってるのには驚きです・・・

SkyrimにおけるVRAMとメインメモリの相互関係

SkyrimがMODにより大量のVRAMを消費することは、周知の通りです。メモリに余裕があればいいのですけど、困ったことにTESV.exeは32bitアプリ(LAA)です。なのでプロセスで確保できるメモリは最大4GBしかありません。この机の広さで全てやりくりしなければなりません。

ここで更なる大問題が1つ。TESV.exeが取り扱うVRAMデータの全ては、TESV.exeプロセスのメモリ空間にコピーを格納しなければならないという制約があります。VRAMだけに書きっぱで後は放置、って訳にいかないのです。多分DirectX9の仕様だと思います(多分・・・)。

4GBのやりくりに失敗した場合は、メモリ不足で確定CTDとなります。MODの入れすぎによる確定CTD要因の1つです。室内は平気なのに外出ると確定CTDとか、VRAMデータを持ちきれなくなった場合にも発生します。

これはつまり、VRAM4GBのグラボを使っても、TESV.exeだけではグラボのローカルVRAMを使い切れないことを意味します。4GBでやりくりする所に、グラボから「4GBのVRAMデータの保存よろしく!」とか言われても完全に嫌がらせです・・・3GBですら多分無理でしょう。

 

・・・これでは僕のGTX980は全くの無駄!?

実際はそんなことは無くて、ENBoostにより大量のVRAMを使用することができます。Boris氏マジ神。

 

通常時のVRAMとメモリの関係

前述の通り、Skyrimで使うVRAMの中身は、TESV.exe内でコピーを預かる必要があります。TESV.exeはどれだけ頑張っても4GBまでしか使えないので、使えるVRAM容量もたかが知れてる、という話になります。とても使い切れません。

 

DirectX9のVRAM管理

※実際はVRAMのコピーを預かるというより、ドライバがVRAMではなくメインメモリに対してレンダリングを行ってからVRAMにコピーするという話が?だからロードとか超遅いんですかね?・・・ここら辺全然詳しくないんで詳細は知りませぬ。

 

ENBoost使用時のVRAMとメモリの関係

一方、ENBoost使用時です。茶色の部分は、さっきと同様にTESV.exeでコピーを預かるVRAM空間です。ここはDirectX9やグラボのドライバで管理されてます。

それに対して緑色の部分は、ENBoostのメモリマネージャに管理されるVRAM空間です。これはSkyrim専用に確保されるVRAMで、このVRAMデータはTESV.exeに代わってenbhost.exeの4GB空間で保存してくれます

ENBoostのVRAM管理

このVRAM肩代わり機能のおかげで、TESV.exeプロセス内で保存するVRAMデータ量が激減します(設定次第で最大64MB~1GB)。

enbhost.exeはVRAMデータを保存するメモリコンテナとして機能するプロセスで、4GB空間全てをVRAM保存の為だけに使ってくれます。1個(4GB)で不足する場合は2つ目のenbhost.exeが起動し、さらにもう4GBを確保します。それでも足りなければ・・・最大32個(128GB)まで面倒見てくれるようです。

この機能のおかげで、Skyrimは32bitアプリでありながらも、大容量のVRAMを使うことができる訳です。

 

ENBoost使用時のVRAM管理

記事のタイトルにもなってます、ENBoostを使う上で重要な2つのパラメータについて。

まずはざっくりのメモリ概略図。さっきの緑と茶色が対応してます。

ENBoost使用時の2種類のVRAM空間

ReservedMemorySizeMb

Skyrimで使用するVRAMのうち、DirectXやグラボのドライバで管理される空間のサイズ設定です。64~1024で設定。ENBoostのメモリマネージャは関与しないです。

このVRAM空間は、VRAM不足に陥った際の「最終防衛ライン」になります。もうこれ以上はどうやりくりしてもVRAM無いよ!的状況下で使われます。TESV.exeのみならずシステム全体のVRAMが不足した場合、このVRAM空間をTESV.exeを含む全てのプロセスでシェアすることで安定化を図ります。スワップしまくりで共用です。

その為、通常はENBoost管理のVRAM空間から先に使用します。緑の所。緑の空間を全て使い切っても尚VRAMが足りない場合は、この空間(茶色の方)に手をつけて篭城します。

TESV.exeでこのVRAM空間を使う場合、前述の通りTESV.exeプロセスのメモリ空間でVRAMデータのバックアップを保持します。よって、使った分だけTESV.exeのメモリ使用量が増加します。例えば1024設定で全部使った場合、TESV.exeのメモリ使用量が1GB増加することになります。

つまり極力小さい値に設定した方が、Skyrimのメモリ的には有利に働きやすいです。ただし物理的なVRAMが小さい環境や、裏で他のアプリを走らせてる等でVRAM事情が苦しい場合、PC自体の安定性に影響が出る可能性があります(スワップして共用できるVRAM容量が小さくなる為)。その場合は必要に応じてサイズを大きくするのが好ましいです。

※ENBoost環境下においては、このVRAM空間を使わない限りはTESV.exeがVRAMデータを引き受けることが無い、ということにもなります。enbhost.exeが全部荷物番してくれます、メモリに優しいです。

 

VideoMemorySizeMb

Skyrimで使用するVRAMの最大サイズ設定。この容量からReservedMemorySizeMbを引いた残りのVRAM容量がSkyrim専用(他のプロセスに明け渡さない)となり、ENBoostのメモリマネージャで管理されます。

VRAMの物理的容量を超えてもOKですが、OSやenbhost.exe、その他アプリの使うメモリ容量を考慮して、VRAM+RAMの物理限界を超えない範囲で設定する必要があります。VRamSizeTest(ENB公式ツール)で計測するのが楽。

 

 

TESV.exeのメモリ使用状況の確認

実際のゲーム内で、両方のパラメータを色々振った時の状態を見てみます。

Win7Pro(RAM32GB)GTX980(VRAM4GB)にて実験。

VRAM3GBでReservedMemorySizeMbが大きい場合

VRAM確保状態の概略図です。正しいメモリマップではありません。あくまでイメージ。

ENBoost3GB、DirectX1GB

VideoMemorySizeMbで3072MBのVRAMを確保します。GTX980のローカルメモリが4GBあるので、グレーの部分(1GB)はSkyrimでは未使用。ReservedMemorySizeMB(茶)が1024MBなので、ENBoostによるSkyrim専用VRAM(緑)は2048MBになります。

 

Whiterunで実験してます。ENBのMEMORYProfilerの値です。VRAM3072MBに対して、空き容量1499MB。 ENBoost管理のVRAM空間がまだ空いているので、ReservedMemorySizeMbは使用されていない筈

VRAM3GBでReservedMemorySizeMb未使用

 

VMMAPでTESV.exeを確認します。数字見えなかったら拡大してください。赤枠内、Heapのサイズは500MB程度です。あとでこれを基準に比較します。

TESV.exeのヒープにVRAMコピー無し

ちなみにPrivate Dataが妙にでかいのは、負荷かける為にuGRIDs17で、first blockも大きく取ってる影響。普通はこんなに食わずに済みます。

 

VRAM2GBでReservedMemorySizeMbが大きい場合

今度は確保量を2048MBに減らします。VRAM半分しか使わないことになります。

ENBoost2GB,DirectX1GB

Skyrim専用で使えるVRAMは1024MBのみ。間違いなく足りないので、あとはReservedMemorySizeMbを使うしかありません。

VRAM空き容量92MB。ReservedMemorySizeMbをモロに使いまくってる筈です

VRAM2GBでReservedMemorySiseMb使用中

ReservedMemorySizeMbを使っているなら、動的アロケーションによりHeapにVRAMデータを格納する領域を作っている筈です。再びVMMAPの出番。

 

さっきと比べてHeapが約1GB増加しました。TESV.exeがReservedMemorySizeMbのVRAMデータのコピーを持っていると思われます。想定通り。プロセスの総確保容量3.8GB。CTDリスクが高まってます

TESV.exeのヒープにVRAMコピー1GB

 

F4でVRAM開放して、501MBの空き容量を確保しました。

VRAM2GB時でVRAM開放後

 

Heapが約500MB減少しました。フラッシュされた分のコピーをTESV.exeが廃棄した為でしょう。

TESV.exeのヒープから500MB分フラッシュ

 

VRAM2GBでReservedMemorySizeMbが小さい場合

VRAM確保量は同じく2048MBですが、ReservedMemorySizeMbを64MBにしました。今度は大部分が、ENBoost管理下のSkyrim専用VRAMになります。

ReservedMemorySizeMb64MB

 

VRAM空き容量65MB。ほぼ使い切ってます。さっきとほとんど状況変わりません。

VRAM2GBをほぼ食べつくした状態

 

けれどもHeapは約600MBしか使ってません。TESV.exeで保存するVRAMコピーが殆ど無い為です。まだ1.4GB近い空きが残ってる為、CTDには程遠いです。同じVRAM2GBでも、こちらの場合ははるかに余裕があります。

TESV.exeのヒープ増加ほとんど無し

但しこれはTESV.exeの安定性に限った話です。もしPCのメインメモリも含めてVRAMが残り65MBしか確保できない状況であれば、PC全体が不安定になる恐れがあります

この実験ではSkyrimに未割当てのVRAMもメインメモリもまだ沢山あるので、全然問題無いです。

 

ローカルメモリを大きく上回るVRAMを確保

今度はSkyrim用に8192MBを確保してみます。GTX980は4GBなので、メインメモリにもはみ出すVRAM量です。ReservedMemorySizeMbは1024MB。

WhiterunでこのVRAM埋めるのが難しかったので、Riften近郊に移動して実験してます

VRAM8GBでReservedMemorySizeMb1GB

※僕の環境ではSkyrim起動しなくても150MB程度はVRAM使ってたので、少し左端グレーにしてます。

 

5GB以上は使ってますね。グラボだけではどうやっても収まりきらないです。メインメモリにも溢れてる筈。

ローカルVRAM上回るVRAM消費状態

 

VRAM溢れてますが、Heapは700MB程度。エリアを変えたので一概に比較できませんが、ReservedMemorySizeMbを使ってるようには見えません。

ローカルVRAM食べつくすもヒープ上昇無し

 

メモリ開放して少しウロつきました。「メモリ開放で空きを作ればHeapがすぐに減る」ということは、Whiterunでの実験で確認済み。

VRAM食べつくし状態からのVRAMフラッシュ

 

特に変化無いですね、同じく700MB程度。というかウロついたせいか少しHeap増えました。

フラッシュ後もヒープの変化無し

つまり、グラボのローカルメモリ容量をオーバーしても、VideoMemorySizeMbで確保したVRAM容量が十分あればReservedMemorySizeMbの空間は使われないということですね。

ちなみにTESV.exeのメモリ状況、ReservedMemorySizeMb未使用なのに確保量3GB超えてます。1024MB降りてきたら確定CTDコース(汗)

※この状況でReservedMemorySizeMbの空間を使用する場合、1GBどかしてグラボのローカルVRAM上に確保するのか、それともAGPメモリ上にそのまま確保するのか?までは見てないです。どの道これが動き出した時点でパフォーマンスは低下する筈なので、十分なVRAM容量を確保するのが好ましいと思います。

 

ローカルメモリを少し上回るVRAMを確保

8GBだとReservedMemorySizeMbにたどり着かなさそうなので、VRAM確保を6GB弱にしました。

(6144と間違えただけですが、見なかったことにしてください!)

 

ローカルメモリの1.5倍のVRAM確保

残量1GB切ってます。これならReservedMemorySizeMbも使ってる筈。

ローカルメモリ食べつくし、VRAM残量わずか

 

予想通り、Heapが大幅に増えてます。でも残量の割には確保量大きめですかね。CTDリスクの高まるメモリ確保量。

ローカルメモリ食べつくし、ヒープも増えた状態

 

VRAM開放します。一気に空きが増大し、残量1024MBを大きく超えました。

AGPメモリ残量1GBからVRAMフラッシュ

 

想定通りにReservedMemorySizeMbが遠のいて、Heapの増分が消えました。600MB以上は掴んでいた模様。

ヒープの上昇分が消失

 

 

まとめ

以上から、ReservedMemorySizeMbは大きすぎれば4GB超過でCTD要因になり、小さすぎてもPCのメモリ事情次第ではCTD要因になります。環境によりけりの設定値ということです。Skyrimで使い切れない程のメモリがあるなら、64設定でも大丈夫だと思います。

VideoMemorySizeMbを十分大きく取れれば、ENBoost管理のVRAM空間だけで事足りる筈なので、可能な限り大きく取っておくのがいいでしょう。

 

まあ・・・細かいことは気にせずに、正にBoris氏の言う通りに設定しているだけで何の問題も無いということだとも言えます!(記事の意味が・・・無くなってしまいますがw)

 

 

(おまけ1)ReservedMemorySizeMbの違いによるFPSの変化

VRAM2GB状態で、ReservedMemorySizeMbの容量を変えてWhiterunをぐるっと歩き回った際のFPS比較です。uGrids15で4kテクスチャ&ハイポリ祭りと、無駄に高負荷にしてあります。

2GB時のReservedMemorySizeMbの違いによるFPS変化

この場合は、64MB設定で大半をENBoost管理下に割り当てた方が、明白にFPS伸びてますね。再起動して2回試してみましたが、いずれも変わらず。これだけ差がでると「体感速度」も段違いでした。VRAM2GBしか確保してないので、1GBずつブツ切りにしない方が効率よかっただけかもしれませんし、実際は色々な環境要因で変わると思います。

ただしこのテスト環境では、前述の通りSkyrim未割当てのVRAMやメモリリソースが余りまくってます。つまり、ReservedMemorySizeMbを使うのは恐らくTESV.exeだけです。他のプロセスとシェアする状況は起きないと思います(他にVRAMたくさん余ってるから)。

もしVideoMemorySizeMb=2048がPCの限界設定だった場合は、ReservedMemorySizeMbの64MB空間だけが「VRAM最後の砦」になります。TESV.exeのプロセス内のコピーと必死にスワップしつつ、他プロセスともこの64MBのVRAMをシェアすることになります。システム全体のパフォーマンスが大幅低下したり、フリーズやCTDが起こるかもしれません。

 

VideoMemorySizeMb=2048、ReservedMemorySizeMb=1024の時のProfilerから。スワップ祭りでテクスチャがえらいことになってました(笑)

テクスチャのスワップ祭り

 

 

(おまけ2)VRAM開放前後の比較

上がRiftenの森林地帯のセーブデータをロードした所。4KテクスチャとuGrids17効果で、VRAM使用量は5GB越え。確実にVRAMのローカルメモリ量を超えてます。それどころかReservedMemorySizeMbにも食い込んでます(1024のままだったので)。

赤枠は、この時のTESV.exeとenbhost.exeのメモリ容量と、「キャッシュ済み」として使われてるメモリ容量です。

VRAMフラッシュ前後の比較

下はF4でVRAM開放した後。2GB程度しか使ってない為、ローカルメモリだけで足りてる筈です。

解放前と解放後のenbhost.exeの容量を比較してみると、両方とも変化が無いことが分かります。VRAM上の未使用データはフラッシュしても、enbhost.exeで溜め込んでる方のVRAMデータは残してるようです。メモリに余裕あるうちは、貯め込んでくれてるままの方が都合良いでしょうし。

反面、ReservedMemorySizeMbの方は、TESV.exeの確保容量が大きく減りました。VRAMもろともフラッシュ対象になったようです(DirectXやドライバ仕様?)。

 

また、VRAM開放に伴い「キャッシュ済み」のメモリも大きく空いてます。VRAM溢れた分を溜めてるAGPメモリってここに分類されるんですかね?

まあ正確にデータフローを追いかけた訳ではないので、おまけネタということで。

 

以上で終了です!