高解像度ディスプレイと低解像度ディスプレイをデュアルで使う(Win, Linux)

ようやく4Kモニタを導入したので方法をメモ。

Windowsの場合

デスクトップで右クリック、ディスプレイ設定でディスプレイごとにスケールを選べるので設定。

大きさは大体合わせられるが、Windowsはフォントが汚いのかレンダラが汚いのかそのどちらもなのか、昔から言われ続けてきたけど相変わらず汚く、さらに古いアプリケーションではビットマップフォントを単純に拡大したかのような滲みの酷い表示となる。これらを簡単に解決する方法はなく、諦めるしか無い。

MacTypeというレンダラを多少いじって綺麗にしてくれるツールはあるが、フォントを入れ替えたりなどを含め色々設定を変えたが満足行くものにはならなかった。それに、一番フォントをなんとかして欲しいブラウザでこのアプリは有効にならないという問題もある(解決策もあるみたいだが、適用できたところで満足できるレベルにはならないと思うとちょっと…)。

まぁでも、設定自体はすぐに出来てとりあえず使える。不満はあるが、まぁ我慢できるかな、程度。

Linuxの場合

Linux(Gnome)の場合のフォントレンダラはかなり綺麗だと個人的には思う。私はMac + Ultra Fine 5K Displayも使っているが、見比べるとたしかに5Kのほうが綺麗だけど(当たり前)、Linuxのレンダリングエンジンも中々のもので、不満は全く無い。

ただLinuxの場合はちょっと設定が面倒だったのでメモしておく。

Ubuntu 18.04 LTS

Ubuntuで確認したが、基本的にどのディストリ、デスクトップ環境であっても大体同じだと思う。設定にはGnome標準の設定とxrandrコマンドを使う。xrandrはX windowのresolution/rotateを起動後に動的に変えるツールのExtension、らしい。

スケールの設定

Gnomeの設定→デバイス→ディスプレイ と移動すると「サイズ調整」というボタンがあるので、これを200%くらいにする。

高解像度ディスプレイが1枚ならばこれだけで完了。あとは何もする必要はない。

でも高解像度ディスプレイと一緒にFull HDも使うとかになるとちょっと面倒な設定が必要になる。上記の設定でスケールを200%とするとこれはすべてのディスプレイで同一の設定になるのでFull HDではUIが通常の2倍の大きさで表示されちょっと使用に耐えない。

というわけで細かい設定をxrandrコマンドで行う。

ここからは話がややこしくなるので一旦やりたいことをまとめておこう。

今、4KモニタとFull HDモニタの二枚がある。GnomeのUIスケールの設定でどちらもUIを2倍の大きさで表示されるようにした。4Kモニタはこの設定で自然な大きさで使用することが出来る。しかし、Full HDディスプレイはUIが通常の2倍の大きさになってる。

これを、xrandrコマンドを用い、仮想的に4Kディスプレイと同じ解像度を設定しておき、それを1/2のサイズ(Full HDサイズ)に縮めて表示する。こうすることでディスプレイに写るUIの大きさは両方のディスプレイで同じになる。これをやっていく。

まず、接続しているディスプレイのリストを得る。

$ xrandr

とすると、現在利用できるディスプレイが列挙される。私の環境(設定後)だと以下のような感じ。

$ xrandr | grep -w connected
DP-0 connected 3840x2160+3840+0 (normal left inverted right x axis y axis) 528mm x 297mm
DP-2 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 527mm x 296mm

ここで、DP-0は右側に置いてあるFull HDディスプレイ、DP-2は正面に置いてあってメインで使用する4Kディスプレイだ。

3840x2160は解像度、「+3840+0」とか「+0+0」とか書いてあるのはディスプレイの表示位置だ。マルチディスプレイ環境ではすべてのディスプレイ領域を包含する仮想的な解像度を定義し、その中で各ディスプレイの表示領域、表示サイズを定義していくような感じになる。DP-0は右側に位置するモニタなのでX座標のオフセットがDP-1のディスプレイ解像度と同じになる。ここで、DP-0のオフセットが0ならば、DP-0とDP-2の表示領域は完全に同一となり、いわゆるミラーリングの状態となる。

で、前述の状態を実現するためのコマンドは以下のようになる。試行錯誤の末にようやくこれでうまく行った。

$ xrandr --dpi 276 --fb 7680x2160 --output DP-2 --mode 3840x2160 --output DP-0 --scale 2x2 --pos 3840x0 --panning 3840x2160+3840+0

--dpi 276 は見ての通りdpiの設定で何かに関わってくるのだと思うが何に関わってくるのか良くわからない。外しても希望通りの表示になるが、一応設定している。

--fb 7680x2160 は前述した「すべてのディスプレイの表示領域を包含する仮想的な解像度」である。今回は4KとFull HD解像度の二枚を横に並べて使うが、Full HDディスプレイの方は4K解像度で表示したものをFull HDサイズに縮めて表示するので結果としては4K解像度を横に2枚並べた分の解像度を指定することになる。

--output DP-2 --mode 3840x2160 はメインで使う4Kディスプレイを4K解像度で表示させるための指定。デフォルトでそのディスプレイの最大解像度で表示されるので指定しなくても良いのかも?

--output DP-0 --scale 2x2 --pos 3840x0 --panning 3840x2160+3840+0 がキモです。こっちは右側に配置するFull HDディスプレイの設定。まず、 --scale 2x2 は縦横1/2に縮小した映像を出力という意味になる。 --panning 3840x2160+3840+0 は4K解像度分でレンダリングして表示領域のX座標は3840(4Kディスプレイの横解像度分)右にずらすという意味ですね。y座標はオフセットしません。 --pos 3840x0 も同じ意味なので使用する必要ないかも…。posは指定しなくても一応想定した通りに動いた。ただ、 --output DP-0 --scale 2x2 --pos 3840x0 --panning 3840x2160 という指定だと表示領域がオフセットせずミラーリングの状態になってしまった。どうも、panningを設定したときはposは無視されるっぽい?けどman見てもそんな事書いてないのでよくわからない。

まとめ

4KディスプレイとFull HDディスプレイを混在させて動作させることはWindows/Linuxの両方で可能。ただし表示品質に不満なく動作させるのはWindowsだと困難、って感じでした。

私はAdobe CCソフトを動かすためのみのWindowsを使っているようなもんなので、Windowsさんにはもうちょっと色々頑張って欲しいです。