32bit版Skyrimの対策記事です。64bitのSpecial Editionには不要です。
(20160309)大幅更新したので、新記事扱いで再アップします。
運用上はあまりクリティカルではないですが、訂正項目が結構有ります。過去に読んでくれた人ももう1度目を通して貰えれば幸いです。
今回はSkyrimが使うメモリについて、いくつかまとめてみることにします。
Skyrimは32bitアプリ(LAA)なので、4GBを食いつぶすとCTDもしくはフリーズとなってしまいます。解像度の高いテクスチャ等のMODを使いまくると結構簡単に食いつぶしてしまいますので、構造を確認しつつ対策を考えてみることにします。
序盤にENBoostの説明をしてます、ENB外してCTDする場合の理由がここにあります。よくわからないorどうでもいい人は、「ENBlocal.iniのメモリ関連の設定」の章まで飛ばしてください。
(20160304)一部加筆&修正。
特に対策をしてない場合のメモリ使用状況
ちょっと実験をしてみました。
- The Bannerd Mareにいるセーブデータをロード
- ドアを開けてWhiterunに進入
以上の動作をしてみます。
(20150918追記) 解像度は1280x720の窓化で測定したので、メモリ消費量控えめになってると思います。
大量のテクスチャMODが入っている場合
ほとんど2K、キャラに関しては4K上等で大量に入れてみました。何の最適化もしてません!
ロードはできたものの、Whiterunに移動しようとドアを開けると、間もなくCTDもしくはフリーズとなりました(確定)。
CTD直前の、TESV.exeが使っているメモリの状態を見てみます。VMMAPを使用。
TESV.exeに割り付けられた4GB空間がほぼ食い尽くされ、Freeが約24MB程度しか残されていません。これを超えるメモリ確保リクエストが発生した瞬間にCTDするんじゃないでしょうか。
Private BytesはTESV.exeだけが使ってる完全ローカルな領域のこと、だと思います。この辺詳しくないんで違ってたらすいません。「3.1GB」に到達しそうですね。
テクスチャMODを外した場合
こっちは同じ環境から、テクスチャMODだけをあらかた撤去してみた場合です。CTDせずに無事移動完了となりました。
確保量で2GB程度、実際に使ってるのは1.4GBも無い感じです。テクスチャMOD外しただけで一気に減りました。TESV.exeが掴んでいる大量のテクスチャデータが、メモリを圧迫してるようです。いくらVRAMのあるグラボ積んでも、TESV.exeのメモリがパンクしてしまっては元も子もありません。
これをどう対処したらいいか?という話にいきます。
ENBoostを使ってメモリ使用量を軽減
多くの人が使っているであろう「ENB」です。これに「ENBoost」と呼ばれる機能があります。これが強烈にメモリを軽くしてくれる逸材でして、
enbhost.exeが新たな4GB空間を確保し、TESV.exeに代わってメッシュやテクスチャ等の大容量データをキャッシュしてくれる
といった動作をしてくれるようです。もしこの4GBでも足りなかった場合、必要に応じて複数プロセスを走らせて、最大128GBまで面倒みてくれるらしいです。物理メモリの方が足りないですね(笑)
したがって、最低限4GBを超えるメモリを積んだPCでないと意味がありません。4GB以下であればTESV.exeで使い切ればいいだけなので。
ちなみに、「ENBBoost」という表記を良く見ますけど、正しくは「ENBoost」です。B1個要らないですねw
ENBoostの効果を確認
最初にCTDした時と同じ状況を試してみました。大容量テクスチャ導入環境です。
CTDせずに問題無くドアをくぐり、Whiterunへ出られました。劇的にメモリ使用量が下がってます。確保領域だけでも1.7GB程度、実際にTESV.exeが使用中なのは820MBも無いですね。メッシュ(というかジオメトリですかね?)もenbhost.exeが面倒見てくれるので、テクスチャMODだけ抜いた時よりも使用量下がってます。
enbhost.exeのメモリ使用状況。当然ですが結構一杯使ってます。おおよそ2.6GB。
このアイコンってスクルドさんがハンマーで叩いてたバグですかね?違ってたらすいません。そもそも90年代の話・・・w
この機能はENBを導入していればデフォルトでEnableになっているので、知らないうちに恩恵に預かっているという人も多いかもしれません。ENBをアンインストールしたりd3d9.dllを抜いたらCTDした、という場合は、この機能の消失に伴うメモリ飽和だと思います。
Crash fix ENBoost
ENBoost自体は、ENBに標準で実装されてる機能です。ネクサスで公開されているENBoost(Crash fix ENBoost、旧バージョンCTD and Memory patch ENBoost)は、ENB作者のBoris氏によるenbrocal.iniファイルです。これはENBの画像処理機能を使わずに、メモリ管理機能のみを使う為のローカル環境用iniファイルで、ENBの視覚効果が無効化設定されています。ENBの画像処理機能を使ってる人(大半はそうだと思いますが)は、上書きせずに必要な項目だけ自分のenblocal.iniにコピペして使ってください。
ENBlocal.iniのメモリ関連の設定
これだけでも有りがたいのですが、他にもENBにはメモリ関連の便利機能が満載です。わかる範囲でまとめてみます(間違いあるかもですが)。
S.T.E.P.に詳しく書いてあります(但しBoris氏が書いてる訳ではないです)。
Guide:ENBlocal INI - S.T.E.P. Project Wiki
ExpandSystemMemoryX64
メモリ確保の方式を変更することで、フラグメント(虫食い)の低下等、メモリ使用量の効率化が図れるようです。この機能はSKSEのMemory Patchのようにfirst blockを増やしてくれるものでは無いので、「同じ機能」ではないと思います。
しかしながら環境によっては、Memory Patch機能でfirst blockの容量を増やしている場合にトラブルになることがあるらしいです。絶対ではないようなので自己判断にて。MemoryPatch環境下で怪しい動作があると思った場合はfalseに設定しといてください。
※Boris氏によると、SKSEによるfirst block増加はあまり良くない(?)ようです。
The problem with the memory patch implemented in SKSE is in wrong value set by default, my words about this problem were ignored and now too late to change anything. Simply decrease 768 mb to, let's say 512 mb.
True設定の場合、ShowRaceMenu Precache Killerは不要のようです。
同じくBoris氏のコメント引用。
I don't use precache killer, because just ExpandSystemMemoryX64 affect showracemenu issue with ECE when SKSE alpha installed.
コメント引用元
ReduceSystemMemoryUsage
前述のenbhost.exeを使ったメモリ軽減をします。enbhost.exeの4GB空間にジオメトリやテクスチャをキャッシュすることで、擬似的に4GBの壁を突破します(TESV.exeが4GB以上使える訳ではない)。複数プロセスを走らせることで最大128GB。古い例えですいませんが、PC98時代の640KB+仮想86メモリみたいな使い方に近いと思います。
この項目をfalseにしていると、当然ですがenbhost.exeは起動しなくなります。基本的にこの機能を切る理由が無いと思うので、true超推奨。
ENBのエフェクトは要らないけどこの機能だけ使いたい場合
(20160304)打消し線だらけで見づらくなるのでまとめて修正しました。
enblocal.iniの設定で、メモリ管理機能のみを有効化し、画像処理を無効にするモードに設定できます。
[GLOBAL]
UsePatchSpeedhackWithoutGraphics=true
trueで画像処理を無効化します。Crash fix ENBoostの導入でもOKです。
DisableDriverMemoryManager
Radeon系でENBがうまくVRAMにアクセスできない場合、trueにすると改善することがあるようです。GeForceしか使ったことないので分かりませぬ。RadeonでENB使ったら真っ黒になった等の不具合に有効かもしれません。
DisablePreloadToVRAM
遠くのオブジェクトのデータを予めキャッシュしなくなります。ロードを挟むセル移動が高速化する反面、カクつきが増えるかもしれません。
どうしても読めないセーブデータが有るとか、VRAM小さすぎて神様助けて!的な場合にだけ試してみるといいかもです。
EnableUnsafeMemoryHacks
(20160309加筆修正)
※公式には廃止宣言されてます。ですが互換性(というか汎用性)を考慮して、機能自体は残しているそうです。
メモリ(VRAM)の圧縮や、ReservedMemorySizeMbの動的アロケーションを行いません。enbhost.exeを起動させない為、64bit環境で8GB程度以上のメモリがある場合は、使うとメモリ環境が悪化します(TESV.exeの4GBプロセスしか使わない為)。
恐らく特殊な環境用だと思います。32bitOS、もしくは64bit環境でメモリが4~6GB程度の場合、enbhost.exeによるメモリコンテナが用を成さないです。この環境でかつVRAM4GBクラスのグラボを使っている場合、恐らくVRAMを使い切ることが無いです。このような環境下で、どうしてもラグがひどくてゲームにならない等の場合に有効な手段。メモリ圧縮だけなら別の設定でもOffにできます(後述)。
動的アロケーションによるメモリ救済措置(ReservedMemorySizeMb)が無くなる為、裏でVRAM多く使うアプリを走らせると(インターネットブラウザとか)、CTDやフリーズするかもです。あとExpandSystemMemoryX64=trueの場合、多分確定CTD。
ReservedMemorySizeMb
(20160309大幅修正)設定方針は結果的に旧版と変わらないですが、構造認識が大分ズレてました、すいません。
Skyrim以外のプロセスと共有するVRAM容量設定です。VRAM残量が低下した場合のPC全体の安全装置。この設定分だけSkyrim専用に割り当てられるVRAM容量が低下します。SkyrimでもこのVRAM領域を使用可能ですが、その際はVRAM使用量分だけTESV.exeのメモリ使用量が増加します。
つまりこれを増やしすぎると、Skyrim専用に使えるVRAM容量が低下する上、VRAM残量次第ではTESV.exeのメモリ使用量がどんどん増加します。よく言われている「Skyrimが使うメモリ容量の設定」ではありませんのでご注意を。
64~1024で設定可。構造が複雑なので以下で軽く説明しますが、よくわからない人は支障の無い範囲で極力小さくするのがいいと思います。
※ちょっとSTEPの説明とは違いますけど、Boris氏の説明や僕が試した実験から考えて、恐らくこれで合ってると思います。
Skyrimだけで全てのVRAMを使い切れればいいのですが、実際はそうもいきません。裏でブラウザ走らせたりしてもVRAM食いますし。そこでPC全体で利用可能なVRAM(ドライバでメインメモリに連結してる分も含む)を使い切りそうになった場合の安全装置として、ここで設定されたVRAM容量をSkyrimを含めた全てのプロセスでシェアする仕組みになってます。Skyrim以外に何も走っていなければ、この容量も限りなくSkyrimだけで使用可能です。
具体的には、この容量分がENBoostのメモリ管理を離れ、DirectX9もしくはドライバによる動的アロケーションの管理下になるようです。
これによる最大の問題点は、VRAMに書き込むデータのコピーを各プロセス内に作る必要があることです(これがTESV.exeのメモリ使用量が増える理由。DirectX9の仕様?)。これによりVRAMからフラッシュされても必要に応じて再度レンダリングせずに戻せるメリットがありますが、仮にReservedMemorySizeMb=1024でこの空間をSkyrimで全て使い切った場合、TESV.exeのメモリ使用量が1GB増加します。3.1GBCTDを起こしやすくなるということです。ENB管理下のVRAMに関しては、enbhost.exeが全て肩代わりしてコピーを持ってくれる為、TESV.exeには影響ありません。
ReservedMemorySizeMbを極力小さくした方が、Skyrimのメモリ的にはメリットが大きいです。ENBoost管理のVRAMが増えて、DirectX9もしくはドライバ管理のVRAMが減る為。反面、他プロセスとシェアできるVRAMが極端に小さくなるので、VRAM不足でシェアする必要が発生した場合は極端にパフォーマンスが低下し、最悪CTDやPCそのもののフリーズに繋がる恐れがあります(DISK I/OによるVRAMスワップのパフォーマンスは・・・いわずもがな)。
それ故に、環境次第で「大きすぎてもダメ」だし、「小さすぎてもダメ」なパラメータになってます。
別記事にて、もう少し詳細あります。
以下、Skyrimで使うVRAMを2GBに制限して、使い切ってみる実験。実際には4GBのグラボ使ってる為、システム全体の不安定化には繋がらないです。
ReservedMemorySizeMb=128のTESV.exeのメモリ使用状況。TESV.exeのプロセスにコピーされるVRAMデータは最大128MBなので、それ程メモリ負荷にはなってないです(全体の確保量だけでも2GB以下)。
ReservedMemorySizeMb=1024。VRAM2GBのうち、1GBがENBoostの管理を離れている為、TESV.exeのプロセス内にVRAMデータがコピーされます。よってメモリ使用量が1GB近く増えてます。
VideoMemorySizeMb
(20160309加筆修正)
ENBoostで管理してくれるVRAM容量の設定。グラボの物理的VRAM容量を超えて設定可能。超過分はドライバ管理下のメモリ空間から確保されます。
ReservedMemorySizeMbの発動条件は、グラボの物理的なVRAM残量ではなく、この設定値からの残量な為、なるべく多く取った方がいいと思います。
ENB作者のBoris氏による、利用可能なメモリ容量の計測ツールが公開されてます。
2kシングル環境なら、8000程度入れておけばまず使い切らないとは思いますが、基本はこのツールの計測値に従えば問題無いでしょう。
あと、僕はWin7でSkyrimやってるので分からないのですが。
Win8でDirectX9のゲーム走らせると、VRAM4GBまでしか使えない制限があるとか(?)Boris氏の計測ツールでも4GB前後で結果出力される場合あるようなので、その場合は素直にその値入れておいた方が良いそうです。
※以下の打ち消し線済の式が昔はお約束でしたが、旧式化してるので使わないでください。enbhost.exeで必要なメモリが不足するかも。
メインメモリ8GB未満の場合
(専用ビデオメモリ)+(メインメモリ)ー2048
メインメモリ8GB以上の場合
(利用可能な全グラフィックスメモリ)ー170 (Win7)
(利用可能な全グラフィックスメモリ)ー350 (Win8以降)
となってます。裏で色々動かす人は、倍引いておいたほうがいいとのこと。
EnableCompression
メモリ圧縮機能。マシンパワーの割にカクつく場合、これも原因のひとつかもしれません。デフォルトtrueですがfalse設定が推奨されてます。32bit環境や、64bitでもVRAMやメインメモリが小さい場合は、trueがよさそうです。
同一セーブデータでの、enbhost.exeでキャッシュされてる容量の比較。trueだと結構小さくなってました。
AutodetectVideoMemorySize
VideoMemorySizeMbの自動設定。trueだとマニュアルで設定した容量は無視されます。
ENB0.303以降の安定化機能
Descriptionによると、ゲームエンジンのマルチスレッド処理に関するバグ対策らしいです。ロード時CTDの原因にもなってる模様。ある程度のfpsを犠牲にする代わり、安定化を図ってくれます。ローカル環境への依存度が強いので、各自でパラメータ調整するのがよさそうです。enblocal.iniに項目が追加されてます。
[THREADS]
DataSyncMode=2
PriorityMode=3
DataSyncMode
メイン機能。0~2(整数)で選択、0でdisable。数字が増えるほど重くなりますが、安定度増加。これが0でPriorityModeだけを調整してもCTD対策にはなりません。
PriorityMode
0~4(整数)で選択、0でdisable。DataSyncModeによるパフォーマンス低下や、カクツキへの対策手段になる場合も。
DataSyncModeによるカクツキ対策
常用すると、僕の環境だと10fps以上低下してました。それより気になるのが、散発的なカクツキ。Grid跨ぐ際に特に顕著に見えます。
なので基本的に常用ではなく、ロードや進行で詰んだ際の一時利用が推奨になってます。DataSyncMode=2、PriorityMode=3の推奨値はあくまで集計結果なので、自分の環境で両方のパラメータを色々試しておくと良いと思います。通常はDataSyncMode、PriorityMode共に0にしておけばOKです。
Skyrim.iniやSkyrimPrefs.iniの不正改変でもカクツキの誘発になるとのこと。thread周りは触らないほうがいいかも?(もっともiHWThreadxとか機能してないらしいですが・・・)
core i7を使っている場合(もしXeon使ってる人が居れば同様)、hyper-threadingはoffにしておいた方がいいそうです。
常時ガクガクになってる場合、
Skyrim.ini
[Papyrus]
fUpdateBudgetMS=1.6
fExtraTaskletBudgetMS=1.6
ここであまり大きな値を設定している場合、止まってるだけでもキツいかも。
SKSEのメモリパッチによる対策
4GBの壁の問題は、ENBoostを使うことで回避できました。しかしながら、別の要因でCTDを引き起こす場合がまだ存在しています。
enbhost.exeを併用した時のTESV.exeのSSの再掲載です。
赤枠内とその下、Sizeを見ると256MBのメモリブロックが2つあることが分かります。赤枠内の方は「first block」とよばれる、最初にTESV.exeが確保する大きなメモリ領域です。
first blockのCommittedを見てみると、Sizeと同じ値になっています。これはfirst blockのメモリを全て使い切ってしまったことを意味してます。
2番目のメモリブロックはまだ100MBほど残っていますが、CTD等の不具合リスクが高まる、あまり良くない状況です。
Skyrim Memory Patchを使う
Sheson氏作の「Skyrim Memory Patch 3.0」を使ってみます。現在はSKSEに組み込まれているので他にプラグイン等の必要はありませんが、ENBoost環境が必須になっています(無くても動くと思いますが、あまり意味が無いかと)。
※S.T.E.P.等のサイトでは「Sheson's Memory Patch」という名称が使われていますが、本家のサイトでこの名称が見当たりませんでした、多分俗称ですかね?そんな訳で正式名称と思われる「Skyrim Memory Patch 3.0」と表記します。
SKSE.iniの中に記述をします。
[Memory]
DefaultHeapInitialAllocMB=768
ScrapHeapSizeMB=256
同じセーブデータをロードしてみました。first blockが512MBと倍増しました。これで安泰です。
もういっちょ試してみます。
[Memory]
DefaultHeapInitialAllocMB=768
ScrapHeapSizeMB=512
second blockも512MBになりました!
「倍プッシュ」
4GB空間自体が増える訳ではないので、他で使えるメモリがどんどん減っていきます!w
無駄にでかくとれば良いというものでもないので、ご利用は計画的に。逆にCTDリスクが増えかねません。first blockを512MBにするだけで十分だと思います。
こんなとこでバージョンアップ版終わります。未だになかなかGTX980で遊ぶところまでいけませんww