技術

ディスプレイとIntel HD Graphicsドライバーの相性

冠婚葬祭系の用事で実家に1週間ほど戻っていたのですが、ついでに以前から用意していた実家の老朽化した業務PCのリプレイスを行ってきました。

元のPCはOSがWindows XPでCPUはPen4時代のシングルコアCeleron、メモリーは512MB(だったかな?)で、少しでもHDDへのアクセスが集中すると信じられないくらい激遅になる感じでした。
新しいPCはOSが32bit版のWindows 8.1でCPUは2コアかつHT対応のCeleron N2820(要はDN2820FYKHです)、メモリーは4GB(だけどOSが32bitなので使えるのは3GBほど)、ストレージはSSDと、以前のものと比べると快適そのものです。ほぼ事務処理専用だしね。

ちなみに32bit版なのは、そうじゃないと動かないソフトがあったため。
64bit Windowsだと32bitプログラム用のProgram Filesのフォルダ名がProgram Files(x86)となってしまいますが、多分そのあたりが原因かと。
通常はそれでも問題ないはずなんだけども、そのソフトが独自の処理をしてるのか、ちょっとやそっとの事では回避できなかったので、諦めて32bitにしました。
実費以上のお金はもらえないからあまり時間をかけられないしね。

なかなか親も新しいOSや新しいアプリの操作に簡単に順応できるタイプではなくて、色々な処理についてなるべく以前の操作方法からかけ離れないようにする必要がありましたし、私もWindowsはほんとごく表面的な部分しか普段つかってないので、結構苦労したのだけども、一部を除いて(これについて後で記事にするかも)まぁまぁいい感じに環境の構築ができたのではないかと思います。

しかし最後の最後で、ちょっと大きめの問題が発覚。
PCをしばらく操作しないでいると画面出力がオフになりディスプレイが待機状態になります(さらに放置するとスリープする)が、そこからキーボードやマウスを触っても、OS自体は復帰してるようなのですが、ディスプレイが復帰しようとしてはPCからの画面信号を検出できずに待機状態に戻る、という動作を繰り返すということに気づきました。
一度ディスプレイの電源を入れ直せば映りはするんですけどね。

とりあえず、Intel HD Graphicsドライバーを削除してMicrosoft 標準ディスプレイ(だっけ?)の状態にすると問題が起きないので、ソフト的な対応が可能だと判断。
Intelさんよ~?もっとちゃんとドライバー作ってくれよ~?と思いましたけど、敢えて良い悪いの話をすれば多分ディスプレイ(BenQ E2200HD)側の問題のほうが大きいのではないかと思いました。
というのも以前MacBookに繋いで使っていたときは、スリープ時にディスプレイが待機状態になったり復帰したりを繰り返すという不具合もあったので。

最悪ディスプレイドライバー無しでもいいかなとちょっと思った(いくら親用だからといって適当過ぎんでしょw)んですが、色々弄ってるなかで、症状が発生している最中にディスプレイドライバーを無効化してから有効化すると復帰することを発見。
(ちなみに違うバージョンのドライバーを3つほど試してみましたが今回の問題については全く効果なしでした。)
もちろん画面が映ってない状態でデイバイスマネージャーを操作するのは難しいので、DevConを使って、コマンドプロンプトで

devcon restart "ハードウェアID"

を「あとはエンターキーを押すだけで実行できる」という状態にしてから問題を再現させ、画面が見えない状態でエンターキーを押す、という感じで確認しました。
(ハードウェアIDはデバイスマネージャーで調べることができるんですが、PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx といった感じのものです。「\」や「&」を含むのでダブルクオーテーションで囲んでくださいね。)

あとは上記のコマンドを画面復帰時(ブランクスクリーン解除時)に実行できればいいのですが、そのタイミングのイベントをどう拾ったらいいのか分からなかったので、とりあえず画面をオフにするまでの時間と、スリープするまでの時間を同じにして、スリープ解除時に上記のコマンドを実行するようにしました。

具体的には、以下のPowerShellスクリプトをPC起動時のタスクとして実行するように設定しました。

#requires -version 2.0
#
# Sleep解除の監視
#

$query = "Select * From Win32_PowerManagementEvent where EventType=7"
Register-WmiEvent -query $query -sourceidentifier "Resume" 

try{
    While($true){
        $newEvent = Wait-Event
           
        Get-Event | Remove-Event
       
        devcon restart "Intel HD GraphicsのハードウェアID"
    }
}
catch{
    Write-Warning "以下のエラーが発生しました"
    $error[0]
}
finally{
    #イベントを削除し購読をやめる
    Get-Event | Remove-Event
    Get-EventSubscriber | Unregister-Event
} 

こちらの記事のソースをほぼそのまま利用しました。
PowerShell: ◆スリープ(Sleep)解除イベントを拾う

上記は根本的な解決ではなく回避策ですし、ディスプレイも古いのでそのうち別のものを使うようにはしたいと思いますが、とりあえず今回はこれで。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください