※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

「ディスプレイ ドライバーの応答停止と回復」対策について



Win Vista/Win7 で 3Dゲームをやっていると、いきなりゲームが終了し、右下に「ディスプレイ ドライバーの応答停止と回復」云々と表示される現象について、その傾向と対策についてまとめる。

そもそもこの現象は、GPUスケジューラが 2秒以上応答がないGPUを殺して強制的に再起動して復帰させることで、復帰不能な死に方をするのを回避する仕組み(TDR)が暴走し、実際にGPUがダメであるかに関わらずGPUをリセットさせてしまい、Direct3Dが窓を失ってゲームが死ぬ現象である。

潜在的にはWinXPでも発生するが、特にVista/7で報告が多い。なお、CUDA/OpenCL等のGPUコンピューティングを利用する際でも2秒応答しないと普通に発現するため修正しないと使い物にならなくなる関係か、Win8からは仕組みが変更された模様。

なお、この文書は新しめのGeforce環境(780Ti)で検証しつつ書いている。RADEONの場合は詳細な操作は不明だが、参考にはなるはず。


先に結論を書いておくと、ゲームをやる上でこの現象が出る環境は、そもそもハード・ソフト(デバイスドライバ自体・デバイスドライバ設定・OS設定)に何らかの問題があるために停止しているのであり、何か標準以外のことをやっているなりするならそれを戻すことで解決する。逆に言えば、そこを解決しないままなんとかしようとしても、頻度が落ちるだけであり、解決はしない。

この問題に関連した様々なページを見てきたが、結局再発して諦めているものが多いのは、上記を理解していないからだと思われる。


デバイスドライバのバージョンを最新にする


古いドライバだとドライバのバグでこの現象が出る場合があることが報告されているが、だいぶ前の話ではある。
しかし、正しくドライバがインストールされた状態となっているかを確認するためにも、最新版ドライバを上書きインストールはやっておいた方が良い。

基本的には新しいドライバを普通に上書きインストール(クリーンインストールできるならなおよし)すれば良いのだが、不安な場合には、最新のGPUドライバをダウンロードした後、アプリケーションの追加と削除から、NVIDIA(AMD/Intel)まわりのドライバ・アプリ類をアンインストールし、再起動を求められたら毎回セーフモードで起動しながら同様な作業を繰り返して関連の項目がなくなるまで全てアンインストールする。終わったらDriverFusionで残骸が残っているか確認し、あれば削除した後、最新のドライバを入れなおしてから通常起動すればよい。



デバイスドライバの設定を変更する

Windows Aeroを有効にしていてもFF11は動作するが、フルスクリーンであっても悪影響があるので切っておくべき。
具体的には、FF11起動に使うショートカットを右クリックしてメニューを開き、「プロパティ」を選択→「互換性」タブを開き、「デスクトップコンポジションを無効にする」にチェックを入れて「OK」ボタンを押せばOK。

また、「レンダリング前最大フレーム数」を減らすことで微妙に表示が遅れる問題を回避する方法があるが、この「応答停止と回復」問題が出た場合にはこの変更は元に戻した方がよい。


GPUが想定通りの状態で動作しているか確認する

PCの拡張カードを差し替えることができる方は、CPU-Z等で、PCI-E が正しくx16で動作しているかも確認すると良い。
基本的にSandy-E/Ivy-E/Hasewell-Eでない場合、PCI-Eのx16タイプのコネクタが複数あったとしても、そこにGPU以外のカードを刺してはならない。他にも微妙な制約があるからだ。
詳細については、マザーボードのマニュアルを見て、正しい位置に層着すること。


メインメモリを交換する。

上記設定を施しても解決しない場合、
  • 別のメモリに交換する
  • マザーボードのBIOS/UEFIのアップデートによるメモリ相性の改善変更を行う
  • メモリタイミングに余裕を持たせるメモリ設定を行う
などの変更により改善する場合がある。

この場合の注意点としては、memtest86等でエラーが出るか等とは関係ないことである(もちろんエラーが出ないものを使うのが前提ではあるが)。一晩回してエラーが出ないメモリでもだめな時はダメである。エラーが出るかではなく、他パーツへの影響を含む相性の問題だからだ。交換するだけしてみるしかない。同様な手段として、マザーボード(・CPU)を交換する手があるが、発生費用・手間が大きくなるのでこれは最後の手段だろう。筆者の環境では実際メモリ変更は効果があり、発生頻度は落ちたが、完全には回復できなかった。


レジストリ値を調整して許容時間を増やす


http://support.microsoft.com/kb/2665946/ja の Fixitを使う方法だが、手動でやったほうが良いかもしれない。実際、MSのサイトでは、64bit Windowsの場合QWORD値で作るよう書かれているが、実際には64bitOS環境でもDWORD値でないと効かない。ただ、筆者の環境では効果はなかった。

  1. Windows ベースのプログラムをすべて終了する。
  2. [スタート] ボタンをクリックし、[検索] ボックスに「regedit」と入力し、上の結果で regedit.exe をダブルクリック。
  3. 管理者のパスワードを要求するダイアログボックスが表示された場合は、パスワードを入力して [OK] をクリックし、確認を要求するダイアログボックスが表示された場合は、[続行] をクリック。
  4. レジストリサブキー「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers」をクリック
  5. [編集] メニューの [新規] をクリックし、[DWORD(32ビット)値] を選択し、[名前] に「TdrDelay」と入力し、Enter キーを押した後、できた[TdrDelay] をダブルクリックし、[値のデータ]に5を追加して[OK]を押す。(デフォルト値2秒を5秒に変更。)
  6. レジストリ エディターを終了し、コンピューターを再起動して変更を有効にする。

ゲームでの利用であるなら、5秒以上に伸ばしても復帰が遅くなるだけなので無駄である。スワップやら何やらの重複要因で2秒を超える固まり方をすることは実際ありえるのだが、5秒以上も固まることがあるような環境ではそもそもまともに遊べない。どちらかというと、CUDA/PhysXを利用するときに必要な修正だと思われる。


nvlddmkm.sysの上書き


いくつか、この履歴ファイルを全て上書きするという手法について書かれたページがあるが、結論から言うとこれは意味がない。これはそもそも現行バージョンのロードに失敗したから過去のプログラムを見に行くための仕組みであり、現行バージョンのファイルが破損している等でもなければ読まれないものであるからだ。


OSごとインストール

CPUやマザーを変える前に試す価値はある。


CPU/マザー(あるいはGPU)を変更

お金持ちならこれで根本解決を図ることになる。もちろんOSからインストールしなおすのがベストである。