日記

マルチディスプレイ時のDisplayPort問題を何とかしてみた

ここで言う「マルチディスプレイ時のDisplayPort問題」(以下、DP問題)とは、「マルチディスプレイ時にPCをスリープさせることで自動的にモニターもスリープし、その際DP接続のモニターが物理的に取り外されたのと同じ扱いになり、 スリープ前にDP接続のモニターで表示していたウインドウ等がスリープ復帰時に他のモニターに移動してしまったり、エアロスナップの状態がスリープ前と微妙に変わったりしてしまう」ことを指します。

このDP問題が発生してしまうと、作業を再開するためにウインドウを手作業で元に戻す必要があったりしてとても面倒なんですよね。

ウインドウの位置やサイズを記憶して復元させるようなソフトもあったりしますけど、微妙にウインドウの隙間が空いたり、うまく機能しないアプリがあったりしてちょっと微妙感があります。

私自身そういうソフトを作成してみたことがあるのですが、「だいたい動くもの」を作るのは簡単なのですが、やはり完璧なものを作るのはちょっとむずかしいようでした。(ウインドウの描画の方法ひとつとってもいろいろなやり方があるからか、正常に位置が取得できないとか正確に位置をセットできないアプリが結構ある印象でした)

私の場合、GeForce RTX 2080 FEからJN-IPS320UHDに4画面出力(モニターのPBP機能を利用)して使っているのですが、このモニターの入力がDPx1, HDMIx3という構成なので、1画面は必ずDPを使う必要があり今回のDP問題が起きてしまうという残念なことになっていました。(厳密にはこのモニターにはVGA入力も1つあるのですがさすがに平成も終わろうという時代にアナログ方式はナシだろうということで除外しています)

そこでこのDP問題をなんとか回避しようということで、2パターンほど実際に試してみました。

パターン1 iGPUを使う方法

今回のPCはCPUにCore i5 8400を使っていますので、CPUにiGPUが載っています。

このiGPUからのHDMI出力に、ヘッドレス用のHDMIドングル(実際にモニターが接続されていると見せかけるやつ)を挿し、RTX 2080のDP出力のモニターとWindowsの設定でミラーリングする、という方法です。

こういうやつ。サーバーとかで使うと便利です。

実はRTX 2080には5つの出力(DPx3, HDMIx1, USB Type-Cx1)がありますので、それをフルに使用できればiGPUを使う必要はないのですが、RTX 2080は同時に4画面までしか出力できないためiGPUを使う必要がありました。

具体的にはRTX 2080のDP2つをHDMIに変換しモニターのDPx1, HDMIx3に接続、次にiGPUのHDMIにドングルを挿してDPとミラーリングする、という形です。

こうすることで、DPが取り外し扱いになってもミラーリングされたモニター(ダミーですが)が残っているためそのモニターの領域を維持できるのではないか?という発想です。

DPのHDMIへの変換はサンワサプライのAD-DPPHD01という製品とミヨシのDP-HDA01という製品を使い、どちらも正常に動作しました。

この方法でDP問題はほぼ回避できたのですが、ブート後の最初の1回目のスリープだけはなぜかDP問題が発生してしまいます。

ブート後1回だけダミーでスリープしてから作業をはじめたりすれば良いのですが、ちょっと微妙です。

また、このためだけに本来私的に必要が無いiGPUを有効化するのも微妙です。

2つのGPUを使うことによる長期的な安定性も気になりますし。(試してみた限りではブート後の最初の1回目以外は安定していましたが…)

ちなみに、RTX 2080とiGPUでミラーリングしたモニターでゲームを動かしてみたりしましたが、ちゃんとRTX 2080のスピードで処理されているようでした。

パターン2 HDMIをDPに変換する方法

RTX 2080 FEにはHDMI出力が一つありますが、これをDPに変換してモニターに入力する方法です。

つまり逆に言えば(?)HDMIx3を確保するためにRTX 2080のDPx3を全てHDMIに変換する必要があります。

4つ全ての映像出力の経路にHDMIを介在させればDP問題を回避出来るのではないか?という発想です。

まずDPx3のHDMIへの変換は先ほど挙げたAD-DPPHD01をひとつとDP-HDA01をふたつ使うことで達成できました。

問題はHDMI-DP変換のほうです。

DP-HDMI変換は上記に挙げた2製品だけでなく他にもたくさん選択肢があります。(とはいえ微妙な仕様の違いや相性の問題も多いようですのでどれでも良いというわけではないとは思います。実際、昔買ったもので画面は表示されるもののDP問題には効果が無かったものがありました。)

しかしHDMI-DP変換は選択肢がかなり限られる上に、価格もちょっと高いです。

で、今回HDMI-DP変換として使用したのはAD-DPFHD01なのですが、とりあえず単体で正常に動作しました。

また、結果的にも4画面出力でDP問題が起こらなくなりました。

こちらの方法にはiGPUを使う方法と比べ、ブート後最初の1回目の問題が発生しない点でアドバンテージがあります。

また個人的に不要なiGPUを無効化したままに出来るので気分的にも良いです。

まだそんなに長期間使っていないのですが、iGPUを使う方法よりも原理的に安定するのではないかと。

追記
1ヶ月ほど経ったあたりから AD-DPFHD01 の調子が悪くなってしまいました。
PCをスリープさせて一晩経った後、スリープを解除するとほぼ確実に AD-DPFHD01 が機能しない状態になるのです。
PCから完全に取り外して再度挿し直すことで復活はするんですが、機能しないということはOSからはモニターが取り外された状態に見えるためDP問題が発生しますし、それに加えて挿し直しの手間が発生するため、何もしないより酷い状態になってしまいました。
これでは使わないほうがマシですw

ということで Quadro P400 を買いました。
Quadro なら EDID を固定する機能が使えますので、 AD-DPFHD01 のようなものを使わずDP直結で問題を回避できます。

ただ、デメリットが無いわけでもないです。

というのも変換アダプタが4つ必要になるうえに、ひとつ(HDMI-DP変換)は電力を取るためにUSB接続も必要になるので、配線がごちゃごちゃになりやすいです。

元がごちゃごちゃしすぎて今回の影響があまりよく分からない写真

あとiGPUを使う方法(DP-HDMI変換x2とドングルx1が必要)よりも当然コストが掛かります。

とはいえ実用上の問題はこちらのほうが少ないため、こちらの方法でしばらく使ってみたいと思います。

他の方法

今回は試してないですが、他にもDPのプラグ状態を維持するアダプタを使う方法や、QuadroでEDIDを固定する方法や、EDID保持器を使う方法や、そもそもスリープで取り外しにならないようにしてあるモニターを使う方法などがあるようです。

どれも入手性やコストの問題がありそうですが、Quadroを使う方法についてはTuringのローエンドのQuadroが出たら試してみたいと考えています。

追記
上に書いた通り、 AD-DPFHD01 の調子が悪くなってしまったため急遽 Quadro P400 を買いました。
Pascal 世代の P400 ではなく Turing 世代のローエンドの Quadro が良かったのですが、出るとしても多分まだまだ先の事になるでしょうし、出たとしてもRTコアが無効化されたものになる可能性が高いと思ったためまぁ良いかと思い P400 にしときました。
いちユーザーとしては、ローエンドにRTコア入れてどないすんねん、という気持ちも分かるのですが、プログラマーとしては機能が無いのと遅くても一応有るのとでは天と地ほどの差があります(とりあえず作ったものを動かせるか動かせないかの差は大きい)ので、ローエンドでもRTコアが入ってるものを出して欲しいなと思っているところです。

肝心の EDID 固定機能については安定して動いています。

DP-HDA01に注意

これは余談なのですが、DP-HDA01はDPのコネクタ部分のプラスチックのカバーが大きめなため、DPポートの周辺の状況によってはしっかり奥まで挿すことができず、接触不良で不安定になったり全く画面が映らないといったことが起こるかもしれません。

ただこれはプラスチックカバーのサイズの問題であって製品自体の電気的な問題ではないため、どうにかしてクリアランスを確保するとか、最悪プラスチック部分をヤスリで削る等で回避が可能です。

実際にうちではこの不安定だったり映らない現象が発生しました。

PCケース(H400i)にRTX 2080を少し上寄りでネジ止めしていたため、DPのポートの上端がケース側PCIスロットの穴の縁にかなり接近していて、そのせいでDP-HDA01のプラスチック部分がケースに当たり、1mmほど浅く挿さるような状態で、不安定だったり映らない問題が起きました。

最初、作業しやすくするようケースを引っ張り出したりせず、DPのポートが目視出来ない状態で横着して手探りで挿したりしていたため、ケースに干渉してきちんと挿さっていないことに気づかず、数時間無駄にしてしまいました…w

全く映らないならもうちょっと早く気付けたかもしれませんが、たまに映ったりするので、ケーブルやポートの組み合わせの相性の問題なのかな?と思っていろいろとっかえひっかえしてて時間が掛かってしまいましたw

ケースをひっぱり出して目視で確認したらすぐに問題に気づいたんですけども、ビデオカードのネジ止め位置の調整だけでは完全に干渉を回避することができなかったため、ヤスリでプラスチック部分を削る羽目になりましたw

まぁ目的は達成できたので満足です。

コメント

同じような症状で悩んでいました。
DPが原因だったとは・・・・
おかげで解決しました。
ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



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

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