ナイトレインのスタッタリング問題の解決、またはWindowsにおいてリアルタイム性の悪いソフトウェアないし賢くないプロセススケジューラを補正する方法
avashe.iconwindowsのゲーム(ELDENRING NIGHTREIGN)がカクついたり定期的にクラッシュすることに悩まされていたが解決したのでまとめを書く
2025-10-04時の結果
https://gyazo.com/3a251d4cd0d5f3d7e5da2e71e66460d8
CPU: ryzen 5900x GPU rtx5080、4k最高品質、obsで1080p録画しながら山嶺地変の常夜カリゴのマルチ時にCapFrameXで収集したメトリクスのグラフ
サムネは滲んでるけど、二回クリックしてgyazoのページに飛ぶと綺麗な画質で読める
上画像のグラフの黄色い破線の下にあるのがスタッタリングの値で、下に凸なところがスタッタリングが起きている箇所
1500秒付近でスパイクがでてるが、それ以外は安定しているのがわかる
この手のパフォーマンスを測りたい際CapFrameXがおすすめ
プロセスのメトリクスを色々収集してこのように集計してくれる、主にゲームが不安定だったり機材入れ替え時の性能変化を調べるとき役立つ
ナイトレイン内は大きいスタッタリングがほぼ確定で発生する箇所があって、それは直っていない(治らない)
1500秒付近、山嶺の竜が吹雪と共に妨害してくるシーン
あとエデレとかも強化形態になって雷をまとってから大きいスタッタリングが発生する、これは直らなかった
スタッタリングというだけでなくこれ以前はゲーム中プロセスのクラッシュを伴う回線落ちに悩まされていたが後述する設定を入れてから一度も落ちてない、本当に嬉しい
やったこと
ほぼ以下のURLを見てもらえればいいんだけど、自分がやったことについて書く
Nightreign Stuttering/FPS Help-Data backed-Updated Often
https://steamcommunity.com/sharedfiles/filedetails/?id=3500176192
ここで考察されている通り、問題はfrom softwareが使っているエルデンリング産のゲームエンジンがP-core/E-coreなどを搭載した最近のintel cpuや多コア化した(正確にはccx≒内部的に実質マルチプロセッサ化した)amd cpuをちゃんと使えていないことにある
windowsのプロセススケジューラに十分な命令を送れていないことでこの問題が起きているので、これを緩和するために以下の作業を行う
ハードウェアやドライバに不具合ないかは前提として確認すべき、上記URLにも問題切り分けのためスキップせず上から順番にやってねと書いてある
ParkControlが改善の主要因であることは間違いない
WindowsではCore Parkingという省電力機能がある。これはCPUの負荷が低いときに一部のCPUコアを一時的に「休止状態(パーキング)」にして、電力消費を抑え、熱の発生を低減する技術。しかしこれによってゲームなどのリアルタイム性が必要なプロセスに大敵のレイテンシが加わる可能性がある。
ParkControlはこれを新しい電源プロファイルをインストールするという方法で無効化してくれる
時間をかけたくない人は一旦ParkControlだけ入れてBitsum Highest Performanceを有効化して様子見するだけでok
後述のProcess Lassoを使う場合はここで何もしなくていいはず
Process Lassoも入れよう
Process Lassoはwindowsのプロセススケジューラが抱えている問題を改善するためのツール
色々windowsのスケジューラの問題点を学べるのでbitsumのサイトは色々うろついてみるのおすすめ
詳細は上記リンクとドキュメントを呼んでほしいのだが、個々でやりたいのはプロセス優先度の設定とperformance modeの設定。ナイトレインを立ち上げた状態で以下を行う。
右の検索窓に nightreign.exe と入力してプロセスを特定、そこに左クリックして以下を設定
CPU Priority > Always
High
Windows Dynamic Thread Priority Boosts Enabled
Enforce by Windows Registry
重要、ナイトレインを始めとしたマルチプレイ対応ゲームはアンチチートの仕組みが導入されているため稼働中のプロセスを直接触れない。この設定はRegistryに設定を事前に書き込むことでプロセス生成時に読み込んでもらえることを利用したPriority設定方法である。設定後ナイトレインを再起動するようダイアログから促されるので従うこと。
本当はCPU affinityを物理コアのみ参照するようにしたいがこれが理由でできない
CPU Affinity > Always > Disable SMT
上述のアンチチートが理由でこれは実質的に無意味のはずだが念のため設定している
I/O Priority > Always
High
Enforce by Windows Registry
GPU Priority
CPUと同じくアンチチートの都合上直接は触れない。またレジストリを使った強制もCPUとは違いできない。ただ、bitsumの推奨の通り、その他のプロセス全体のGPU Priorityを下げることで間接的に上げることが可能。これに従う。
Unfortunately, GPU priority classes are not inherited by child processes and “Enforce by Registry” (IFEO) methods are not supported. This means that processes protected by anti-cheat systems won’t be able to have their GPU priorities set. In these cases, we instead recommend focusing on ensuring other processes with GPU workloads are set to below normal or idle priorities.
一方でその他のプロセス全体のCPU Priorityを下げるのはやめたほうがいい
既存のプロセスリストを眺めればわかるが、それぞれのソフトウェアがそれぞれのワークロードに則したCPU Priorityを設定しており、全体を下げるとちゃんと考えて作られたソフトウェアが設定したはずのPriorityの諧調を潰してしまうことになる。GPUに強く依存するソフトウェアが少数な一方、多くのバックグラウンドプロセスやサービスがCPUを使うため、システムの応答性に影響を及ぼす可能性が高い。つまり適当にやるのは危険。
GUI左上のメニューのOptions > GPU > GPU Priorities...を開く
これがGPU Priority Classes、プロセスを個別で左クリックして設定もできるし、こうやってGUI左上のOptionsからはプロセス全体を一望するルール設定を見ることもできる。超便利。
ここで * を Below normalに、 nightreign.exe を Normal にする
https://gyazo.com/6256e3c59a982d6a5e3d06b42f53748b
プロセス名を正確に書く以外にもっと表現力の高い指定をすることが可能
ここを参照。正規表現とかも使える。
アンチチートによって無視されるのでNormalにすることは意味がなく、nightreign.exeはNormalになってくれるが、記憶を失ってからこの設定を見返すと混乱しそうなのでお行儀よく上書きしている。
後述するがこれら設定はnightreign.exeを起動するeasyanticheat_eos.exeにも適用しておくとよい
Induce Performace Mode
これがチェックされたプロセスが起動すると、ユーザが指示した電源設定に自動で切り替えてくれるようになる
Bitsum Highest Performanceを呼び出してもらうように下記の追加設定が必要。基本的に上記リンク先の画像で示された設定をしてほしい。
Options > Power
Bitsum Highest Performance > ここでinstallとかinitializeという文字列があったらクリックしてインストールしておく
Performance Mode
Change power plan when engaged
Select power profile... > Bitsum Highest Performance
Disable Idle Saver when a game is running
私はautomatic detectionは入れてない、個別でゲームプロセスを指定しているため
Exclude Probalance Mode
Probalance Mode自体はシステムの応答性を改善するので有効化したいが、特にリアルタイム性が重要なプロセス、つまり今遊んでいるゲームについては除外する
Probalance Mode自体が何をして何を解決しているかは上記リンク参照、わりとシステムの応答性とプロセスのワークロードの性質の関係性について勉強になる
CPUバウンドで時間がかかっているプロセスがあり、それを早く終わらせたいと思うと素人目ではpriorityを上げたくなるが、むしろシステムの応答性は落ちるので逆効果。それらのpriorityを少し下げることで、多数派であるIOバウンドかつバックグラウンドプロセスのpriorityが相対的に上がりシステム全体の応答性が向上する。IOバウンドプロセスはすぐCPUを手放してスリープするのでpriorityを上げてもCPUバウンドプロセスの処理時間にはほとんど影響しない。
Performace Modeの記載によればProbalance Modeからは除外されるはずだが、念のため明示的に除外しておく
The set of actions Performance Mode takes is currently limited to switching the active power plan (profile), and excluding the target process from ProBalance – though the latter is not usually necessary given ProBalance’s default set of exclusion criteria (i.e. foreground process). However, in the future, other actions, such as adjustments to the ProBalance algorithm may occur. For this reason, we recommend using Performance Mode over a simple Application Power Profile rule.
上記nightreign.exeの設定を EasyAntiCheat_EOS.exe にも適用する
親プロセスに設定を入れておけば子プロセス(この場合 nightreign.exe )にも影響することがあるという経験則に従って設定してるが、どれだけパフォーマンスに影響しているかは不明。まぁやらないよりやっておいた方がいいという気持ちの問題である。nightreginではない場合でも、ゲームのランチャーのプロセスに設定するのは良い経験則である。
その他自分がインストールした覚えのあるプロセス名のうち、レスポンスの速さが重要でないものについてはCPU Priorityを落としたり、完全に不要なサービスをアンインストールしよう
繰り返すが、デフォルトでNormalよりも高いPriorityが与えられているものは触らないこと。また、知らないプロセスはシステムのコアコンポーネントに関連する可能性が高いので触らないこと。
私の場合AdobeのCreative Cloudの常駐プロセスや、たまにしか使わないスマートウォッチのデバイスドライバ兼同期サービスのPriorityを落とした、Teamsとかはアンインストール。
BIOSレベルで解決する方法としてHT(Hyper-Threading)/SMT(Simultaneous Multi-Threading)を切るというものがある、これで改善する可能性もあるが、本当にゲームのみ立ち上げて遊ぶ人場合以外はやめたほうがいい。
https://gyazo.com/f5aee7996e798fe0df47966577b7b9b7
SMTを切った場合のメトリクス
ゲームプレイを録画したり、discordとnvidiaのノイキャン(nvidia broadcast)入れたり、攻略情報のメモを見るためにwebブラウザ立ち上げたりしている私のユースケースだと、SMTを切ったことで定期的にスレッド負荷が100%近くまでスパイクするようになった
先述のSMT onバージョンだとこれはでてない
FPSが不安定になり、スタッタリングも多いことがわかる
ゲームはゲームだけが最速で動ければよいのではなく、システム内におけるバックグラウンドプロセス群が十分低レイテンシで応答し続ける必要がある、それらの処理のためにも多コアが必要
ナイトレインは微妙とされているが、最近のよく作られたゲームエンジンはHT/SMTを認識してパフォーマンス改善につなげてくれるので、積極的に有効化したほうがいいとされる
SMTを切る場合でもちゃんと計測したデータを確認しよう
やってから思ったけど、私が使っているのはryzen 9なのでccx2つ搭載、つまり2つのcpuが乗ってるのと一緒なのでゲームのスレッドがccxをまたぐとデータロードにレイテンシが生じてしまう。なのでSMT無効化より片方のccxを無効化したほうがゲームの1% low fpsには効果あるかもしれない。あくまで仮説であるが、そういう機能を提供するマザボなどもあるようなのであながち外れてないかもしれない。
CPU Affinityの機能で実行プロセスのP-core/E-core指定やCCD(CCX)の指定もできるようになったらしい、神
なおアンチチートが入ってるゲームでは触れない😭
https://bitsum.com/product-update/process-lasso-14-2-improved-core-selection/