個人的に遭遇したFPSの問題に関する不具合、とその調査過程、および対策を無差別にこちらにまとめています。基本的におま環だと思いますが、もし何かの参考にしていただければと思います
- 検証
- FPSが表示されている数値通りに出ていないような…
- 最終的にわかったこと:SMPは、ENBよりも重いっ…!!
- NPCやバニラの装備をUNP、CBBE、もしくはバニラに戻す
- PapyrusLogを無効にする
- CPUの設定をする
検証
環境
グラボ:RTX3070
CPU: Intel i5-12400
電源:800w
解像度:4k
ENB:Vanilla ENB TWO
症状
・GPU使用率が最大70%程度までしか上がらない。FPSは20~30
・HDT-SMPメッシュをもつキャラクターが画面に描画されるとGPU使用率が40~50%に低下し、FPSも15~25あたりまで落ち込む。キャラクターが増えるほどさらに低下する。
・ENBをオフにしても改善しない。
※ 2022/11/22 時点で、WindowsのタスクマネージャーのGPUの表示はバグってるらしく、正しい使用率を表示していないようです。なのでMSI afterburnerというツールを使って計測しています。
改善後
GPU使用率が最大100%まで上昇するようになった。FPSも40~50、後負荷時でも40FPSをキープ。ENBをオフにすれば60FPSをほぼキープ可能
とにかく原因を探る
最初は電源不足などハードの問題なども疑いましたが、ほかのゲームではGPU使用率100%に達しパフォーマンスも十分に発揮することは確認していたので除外。
よって自環境のSkyrimの問題として検証を開始しました。
HDT-SMPを切ってみる
HDT-SMPを無効にしてみると、FPSが45~60で安定しました。
やっぱりスペックの問題?…と半ば希望を失いかけたのですが、高負荷時にGPU使用率が上がるのではなく下がってFPSが低下するのはやっぱりおかしい。
試しにニューゲームをし、ホワイトラン郊外で確認してみるとFPSが30~40程度当たりで安定し、GPU使用率も100%あたりまで上昇するようになりました。
ゲームの進行によって発生している不具合か?ひょっとしてPapyrusスクリプト?と踏んでScriptフォルダのPapyrusログを見ると、新規セーブでは1時間プレイしても300kbのサイズなのが、問題の発生するセーブでは1時間もたてば30000kbのサイズにまで膨らんむようになっていることがわかりました。
中身をみると、大量のstack dumpが発生していて、定期的にスタックログが吐き出されている様子でした。
セーブデータの中身を見てみる
大量のログから想像するに、無駄なPapyrusスクリプトがセーブファイルにたまってる?と考えReSaverというツールを使って問題のセーブデータを開いてみると…
こんな警告メッセージが表示されました。BonfireFlasktrackerというスクリプトがスタックしていて、とんでもない数のスタックがたまってしまっているみたいです。
skyrimspecialedition.2game.info
Forumを覗くと同じ症状が出ている方がほかにもいる模様。セーブデータをクリーンしてみて問題が解決するか試してみて!とのことなのでとりあえず不要なデータのクリーニングを済ませてゲームを再起動しセーブしReSaverで再度開いてみるが、同じ警告が発生。
セーブデータをいじっても問題解決しないと判断、該当MODを外してみる
MODを外したので、新規セーブから開始。それから20時間くらいプレイしましたが、あの大量Stack Dumpは発生しなくなりました。
複数人映り込んでも30FPSをキープ、数十人規模の大乱闘でも25FPS以下を下回ることはなくなりました。
※MODに何か問題があったかどうかはわかりません。私の環境に合っていなかっただけと解釈しています。
結論:Papyrusスクリプトのエラーによる大量スタックでFPSが低下
まさかグラフィック関連以外の点でFPSに影響が出ているとは思いませんでしたね。
さらにFPS低下以外に様々な問題を引き起こしていたこともわかりました。ほかのPapyrusスクリプトを使ったMODが意図した挙動で動いていなかったのです。
思えば有効にしているはずのMODの効果がゲーム上で確認できなかったり遅延が激しかったり不安定だったりと、それもプレイ時間が延びるほどひどくなっていたのでおかしな点はいくつもありました。これは当然で、大量の処理されないスクリプト(無限ループか何かしてる?)がスタックを占領していたわけで、ほかの動くべきスクリプトがスタックされず無視されていたのでしょう。
----------------------------↓それからしばらくして…----------------------------
FPSが表示されている数値通りに出ていないような…
ところどころかくつき、FPSが体感的に数値の通りに出ていない。表示上は30FPSですが、体感的には20FPSを下回っているんじゃないかというくらいカクカクしている…何かがおかしい。
FPSはENBの機能のFPS表示機能で確認をしています。ENBのFPS LimitでFPSを30に制限し、画面のリフレッシュレートを59.94Hzで遊んでいました。
試しにこの機能を無効にしてOSのリフレッシュレートを30Hz、つまり30FPSに変更してみました。
-------------------------------
まだ重い
上記設定でもあまり変わらず、高負荷地域に足を踏み入れるとやはりFPSが低下。となるとやはりうちはスペックの問題か…とまたも希望を失いかけるも、再現する条件は限定的でHDT-SMP装備、メッシュのキャラクターが映り込む度にその現象が発生するので、ひょっとしたらSMPの設定ファイルか?とあれこれ弄り回したところ、FPSが10~15ほど上昇。
FSMP HDTのconfigファイルをいじる
Faster HDT-SMP\SKSE\Plugins\hdtSkinnedMeshConfigs\configs.xml
上記設定ファイルをいじります。
なおインストール時の設定でCUDAを有効にしています。
・<solver><numIterations>を8に修正
・<solver><maxSubSteps>を21に修正
・<configs><smp><percentageOfFrameTime>を10に修正
・<wind>の<enabled>をfalseに修正
・<autoAdjustMaxSkeletons>をtrueに修正
男主人公HDT-SMP装備+女フォロワー3人SMPメッシュ体系HDT-SMP装備でプレイしてたところ、FPSは30を下回ることもなく、ディスプレイの設定を元に戻してFPS制限解除下では屋外で山賊20人相手に4人でどんちゃん騒ぎを起こしても最低でも40FPSをキープできるようになりました。GPU使用率も100%まで伸びるようになり、十分にパフォーマンスを発揮できるようになりました。
追記:percentageOfFrameTimeの設定値を下げる
特にpercentageOfFrameTimeは下げれば下げるほどパフォーマンスがみるみる改善されていきました。ひょっとしたらこれの調整だけでも事足りるかもしれません。これで大きく改善されるのは私のCPUがたいしたスペックではないからでしょうかね。最低の1とかでもいいかもしれない。
追記の追記:FSMP ver2以降からは特にいじる必要なし
FSMP Ver2.0.5ではオプションでおすすめとされているPerformanceモードを設定すればほぼ自分で設定をいじる必要はないと思います。
追記の追記の追記:FSMPMについて
FSMPの設定をMCM上で変更できるFSMPMというものを入れてみましたが、私の環境だとCPUがフル回転してどうやら負荷が上がっているようでした。
考えてみればxmlファイルではなくMCMの設定を使うわけですから、FSMPのインストールオプションでextreme performanceの設定をしようが無視されるわけで、そこそこのPCで遊んでいる私にとってはこの設定一択ですから無用の長物でしたね…。
ゲームとは関係ありませんが電気代も高騰していることですし、なるべくエコにゲームを楽しみたいので負荷軽減優先で
遊びたいところです。
追記の追記の追記の追記:やっぱりいじった方が軽くなる模様
インストール時のオプションでExtreme Performanceを選択してもSMP機能モリモリのSkyrimだとやっぱり重い。SMP WindというMODを入れてSMPフォロワーを2人連れて嵐の日に外にいるとガクっとFPSが落ちました。
試しにとxmlをいじってみるとかなりFPSが向上したのでやっぱり必要みたいでした。以下は調整した項目とその値。
<percentageOfFrameTime>10</percentageOfFrameTime>
<sampleSize>3</sampleSize>
<numIterations>4</numIterations>
<maxSubSteps>2</maxSubSteps>
PICHO ENBで試してみましたが、同じく40FPS以上をキープ。大抵のENBでも十分なパフォーマンスは発揮できるようになったんじゃないかと思います。
最終的にわかったこと:SMPは、ENBよりも重いっ…!!
SMPってかなり重いんですな。改善前はSMPキャラ一人当たり8FPS以上もってかれてました。自身も含め3人連れまわせば30FPSもってかれるわけで、そりゃ重いわなと。現在は同じ条件で15FPSほど食われるので、一人当たり4FPSくらいのコストでしょうか。半分程度になりました。
GPUの使用率が落ちるのはGPUよりもCPUで処理してるからなのかな。でもCPUも50%あたりまでしか使用してないんで、となるとチューニングの問題だったりするのかな。SkyrimはDIrectX11なのでDrawcallの数に限界があるとかいう話も聞きますし、その影響もある?スカイリムのエンジンの限界?もう10年以上前のゲームですしね。
とりあえず30FPS以上は私には必要ないのでこの辺りでチューニングは打ち止め。SMPのクオリティを落としている設定なので実際コリジョンが正確でなかったりSMPが一部フォロワーで時々停止したりします。
「まぁでもとにかくなんかゆれてりゃ十分」な感覚の私では十分なんですが。フォロワーだって大体ケツか背中みてることがほとんどですしなぁ。それか何かのシーン(多分エッッ目的)では困ることはある…かもしれません。未検証です。
何人でもいけるのかと試しにSMP対応NPC10人を同時に画面に表示させたところ、FPSが20まで低下しました。やっぱり重いものは重いみたいです。まぁ、こんなにたくさん連れ歩くことはないのでいいのですが…
ともあれ、DLSSの非公式MODが作成中という驚きのニュースもありますし、ひょっとしたら気にしなくてもよくなったりするのかもしれませんね。
-------↓ここから単発系です。
NPCやバニラの装備をUNP、CBBE、もしくはバニラに戻す
自キャラと自作フォロワー、一部のフォロワーMOD以外のNPCどうでもいい人間であれば、全てのNPCにわざわざSMP系の装備やハイポリな体系MODを適応する意義はあまりないと思うので処理コストの低い体系MOD、それを適応したバニラ装備にします。BHUNPや3BAはバニラと比較すれば比較にならないハイポリ体系な上にPhysics系にも対応するため、NPCをたくさん追加するMODなどをいれて乱闘が当たり前のような環境になっているSkyrimなどではボトルネックになってきます。
よって、モブNPCに軽い体系、CBEE、UNP、バニラを適応して処理軽減を試みます。
CBBEであればCBBEにデフォルトで入っているBodyslideデータで作成できます。Bodyslideを起動し、Outfit/bodyでCBBE Bodyを選択、でfilter GroupでCBBE Vanilla Outfitsにチェックを入れてbatch build、buildボタンを押せばバニラ装備と体系メッシュが出力されます。
UNPの場合はこちら。
Outfit/bodyでUnified UNPを選択、filter GroupでUUNP Vanilla Outfits (Non HDT)にチェックを入れてbatch build、buildボタンを押します。
バニラは単純にバニラのメッシュを使うだけですね。
なお、CBBE Body PhysicsやUnified UNP HDTなど揺れ対応体系など選べますがそちらはお好み、マシンスペックとの相談で。
私は自作フォロワーがバニラの体系を参照している関係上、裸体系のみBHUNPにし、装備に関してはMODで追加したBHUNPの装備を着せています。多くのNPCは大抵バニラ装備を着ているので引っぺがさない限りはここで出力したボディメッシュになっているため処理コストの節約になるという算段です。
PapyrusLogを無効にする
基本中の基本なんですがよく忘れるので…ファイルの入出力はパフォーマンスに大きく影響を与える可能性があります。これを切るだけで環境によっては相当軽くなることもあるかも。調査目的以外では切っておいた方がいいかと思います。
papyrus.logが数十分で数千キロバイトとかいくような環境なら効果はでかいんじゃないでしょうか。(そんなにログでてるとどっかでスクリプトがスタックしてる可能性もありますけどね)
CPUの設定をする
Skyrimは割とCPUが重要なゲームとも言われてますよね。なのでCPUをより効率よく使うための設定をすることで、さらにパフォーマンスが向上する可能性があります。
以下の動画を参考にしています。
1. 以下のMODをインストールします。
2. インストール後、同梱されているファイルの「SKSE\Plugins\PriorityMod.toml」をテキストエディタで開きます。
3. Windowsのシステム情報を開き、CPUのロジカルプロセッサの数を確認します。
上記の場合では12です。
4. CPU Affinity Mask Calculatorにアクセスします。
5. アクセスしたらCPU0~順番にロジカルプロセッサの数だけチェックをつけます。つまりロジカルプロセッサが12ならCPU0~CPU11までにチェックを入れます。
6. CPU Affinity Bitmask (hex)のテキストボックスをコピーし、先ほど開いたPriorityMod.tomlのaffinityの値に貼り付けます(デフォルトは0)。
追記:CPU1とCPU3はチェックを外さないといけないみたいです。誤解を招いてしまい申し訳ありませんでした。
-----------
私の環境ですとカクツキが減った気がします。モーフを動的に変更したりSMP装備を付けて遊んでいると効果が高いのかもしれませんね。SMPはGPUよりもCPUの処理能力によるところが大きいらしいです。
フリッカーもやってます★