리눅스와 고해상도 모니터 (HiDPI), 그리고 고통받는 리눅서

XPS 13을 이제 약 반년째 쓰고 있어요<

그동안 사용하면서 이것저것 다 마음에 드는 상태로 고치면서 (소프트웨어 적이건, 하드웨어적으로 바꿔버리건) 사용했지만, 딱 하나 고치지 못하고 타협하면서 썼던 것이 있었어요.

그건 바로 HiDPI 에요.

윈도우 에서도 지원이 오묘해서 종종 프로그램의 모양이 이상하게 나온다거나 하는 HiDPI 지원은 리눅스도 사정이 크게 다르지 않아요. 아니, 훨씬 더 심각해요. 좋게 표현해서 리눅스 환경에선 ‘역사가 깊은 프로그램’을 많이 사용하게 되는데, 그 프로그램들은 대부분 한참 전부터 업데이트가 그리 활발하게 이루어지지 않는 경우가 많아요. 그런데 그런 예전에 만들어진 프로그램들은 대부분 HiDPI 에 대한 개념이 없던 시절부터 있던 경우가 많다보니, HiDPI 환경에선 사용이 불가능 할 정도로 작게 나오거나, 아니면 GUI 레이아웃이 와장창 깨져서 나와서 아주 미워보이는 문제가 있죠.

그나마 그런 HiDPI 문제는 GTK3, Qt5 기반 프로그램이 늘어나면서 (그럭저럭) 해결이 되어가고 있지만, 아쉽게도 하나 해결되고 있지 못하는 부분이 있어요. 그건 바로 HiDPI 모니터와 일반 (96dpi) 모니터가 섞여 있는 환경에선 어떻게 돌아가는가 하는 문제에요.

우분투 같은 사용자 친화적인 배포판의 경우엔 어떨지 모르겠지만, 미노리가 사용하고 있는 아치 리눅스는 사용자가 꽤 많은 설정을 수동으로 해야 하는 배포판이에요. 그러다 보니 지금 사용하고 있는 DE인 Plasma5의 기본 동작대로 많이 사용하게 되는데요, 이 DE의 경우엔 기본 설정 상 설치하자마자 바로 HiDPI 가 감지되지 않는 경우가 많아요.1)모니터의 망가진 EDID라거나, 등등… 그래서 각종 꼼수를 사용해서 HiDPI 환경에서 사용하기 적합하게 만들어 두는 경우가 대부분이죠.2)예를 들어서 이것처럼 이런 환경에서 일반 모니터를 컴퓨터에 연결하면 일반 모니터 쪽 화면이 HiDPI 모니터 쪽 스케일링 배수만큼 더 커져 보이게 되어요. 이대론 사용하기가 아주 힘들죠.

이 문제를 근본적으로 해결하기 위해선 Wayland를 사용해야 하지만 Wayland는 ‘올해 말쯤엔 사용할 만 할 것’이라는 말만 무성한 채로3)올해 말 디스플레이 서버 수년째 실생활에서 아무 문제 없이 사용하긴 좀 힘든 상태에요. 그래서 결국 이런 선택지 중 하나를 선택할 수 밖에 없게 되죠.

  1. 그냥 한쪽 모니터는 아주 크게 나오는 상태로 사용한다.
  2. 그냥 한쪽 모니터는 아주 작게 나오는 상태로 사용한다. 그리고 매번 모니터를 연결했다가 분리할때마다 HiDPI 관련 설정을 바꾼다.
  3. 듀얼모니터를 포기하고 HiDPI 모니터만 사용한다.
  4. 듀얼모니터를 포기하고 일반 모니터만 사용한다. 그리고 매번 모니터를 연결했다가 분리할때마다 HiDPI 관련 설정을 바꾼다.

지금까진 3번 선택지를 사용해 왔는데, 눈이 아파서 도저히 안되겠다는 생각이 들었어요. 그래서 한번 해킨토시를 설치해서 맥의 더 나은 HiDPI 지원을 체험해 보려다가 결국 포기하고 5번 선택지를 선택하게 되었습니다<

5. 일반 모니터를 HiDPI 인 것 처럼 속인 후, 실제로 화면 출력은 절반 사이즈로 줄여서 출력하면서 사용한다.

우선 테스트

테스트 목적으로 이미 실행되고 있는 DE에서 다음과 같은 명령어를 입력해 봤어요. 노트북의 내장 디스플레이 (HiDPI) 는 eDP1 인터페이스에, 외장 디스플레이 (일반 dpi) 는 DP1 인터페이스에 연결되어 있어요.

xrandr --output DP1 --auto --fb 3840x2160 --scale 2x2 --pos 0x0

모든것이 두배 두배로 커졌던 일반 dpi 1080p 디스플레이가 멀쩡한 사이즈로 출력되기 시작했지만, 바탕화면이나 패널 등이 여전히 절반 크기로 출력되고 있었어요. 새로 실행하는 프로그램들은 모두 정상적으로 동작하고, 플라즈마 쉘을 죽였다가 다시 켜면 그 다시 켠 부분들은 멀쩡하게 동작하는 걸 보고 올바른 방향으로 오고 있다는 걸 알았어요. 플라즈마 전체를 저 명령어를 입력 후 다시 껐다가 켜거나, 아니면 아예 플라즈마 세션이 시작하기 전 저 명령어를 입력하면 해결된다는 거죠. 그래서 저 명령어가 X가 시작한 후 플라즈마 쉘이 실행되기 전 실행되도록 .xprofile 에 다음과 같은 내용을 추가했어요.

# 2x2 scaling when external monitor is connected via DP1 port
if [ $(xrandr | grep "^DP1" | cut -d ' ' -f 2) = "connected" ]; then
        /usr/bin/xrandr --output DP1 --auto --fb 3840x2160 --scale 2x2 --pos 0x0
fi

다시 시작

로그아웃 하면 X가 꺼졌다가 다시 켜지면서 SDDM을 불러오기 때문에, 로그아웃 후 다시 플라즈마 세션을 시작했어요. 순간적으로 올바르게 스케일링 된 화면이 보이다가, 다시 두배 두배로 큰 화면이 보이기 시작했어요. xrandr 결과에선 화면이 3840×2160이 아니라 1920×1080 이라는 말이 나오고 있었죠. 왜 그런가 고민을 하다가, Plasma 세션이 시작되면서 디스플레이 설정을 건드리는 것 같다는 결론에 도달했어요. 그래서 이걸 수동으로 설정하기 위해서 (어차피 해상도 설정은 한번 하면 잘 바꾸지도 않으니) KScreen 2 데몬을 자동으로 시작하지 않도록 바꿨습니다< 그리고 나서 다시 시작하니, 짜잔, 멀쩡하게 동작하는 화면이 나오기 시작했죠.

과도한 욕심을 버리자

듀얼 모니터를 다 사용하면 정말로 좋겠지만, 결국엔 노트북 본체 모니터는 끄는게 더 낫다는 생각이 들었어요. XPS 13에 달려있는 Intel UHD Graphics 620의 성능이 너무 암울해서4)아니, 이름은 UHD 라면서!, 4K+QHD 디스플레이의 3D 컴포지팅을 도저히 감당할 수 없었기 때문이에요. 그래서 최종적으론 다음과 같은 설정을 .xprofile 에 넣었어요.

# 2x2 scaling when external monitor is connected via DP1 port
if [ $(xrandr | grep "^DP1" | cut -d ' ' -f 2) = "connected" ]; then
        /usr/bin/xrandr --output eDP1 --off --output DP1 --auto --fb 3840x2160 --scale 2x2 --pos 0x0
else
        /usr/bin/xrandr --output eDP1 --auto
fi

else 쪽은 아마도 필요가 없겠지만, 혹시 모르니까<

실제 사용

그래서 지금 실제로 위와 같은 설정으로 사용하기 시작했어요. 4k 크기의 프레임버퍼는 여전히 UHD 620에게 버겁지만, 그래도 아쉬운대로 실제로 사용할 수 있긴 해요.
외장 일반 dpi 모니터를 연결해서 사용하고 싶다면 외장 모니터를 연결한 후 세션을 로그아웃 했다가 다시 시작하면 복잡하게 설정을 하나하나 일일히 바꿀 필요 없이 돼요. 다시 HiDPI 모니터를 주로 사용하고 싶다면 외장 모니터를 분리한 뒤 똑같이 하면 HiDPI 모드로 돌아와요. 듀얼 모니터를 사용할 수 없지만 (성능 문제로), 그래도 책상에서 13인치 노트북 화면을 째려보지 않고 27인치 모니터를 보면서 편하게 사용할 수 있게 되었다는 점은 아주 만족이에요. Wayland가 멀쩡해져서 모니터의 DPI에 맞춰서 자동으로 화면을 스케일링 하기 전까진 가장 실용적으로 사용할 수 있는 방법일 것 같아요.

덧붙임

xrandr를 이용한 scale 설정은 지난 7년동안 망가져 있는 상태라서 사용할 수 없었어요. 다행스럽게도 이 글을 쓰는 시점에선 고쳐진 상태지만, 업스트림에서 고쳐진 지 약 한달밖에 되지 않아서 많은 배포판에 아직 배포가 되지 않았을 수 있어요. 고쳐진 버전은 1.20 이에요.

OpenGL을 사용한 컴포지팅 성능이 너무 처참해서 도저히 써먹을 수 없겠다면 모든 애니메이션을 끄고 XRender를 이용해 컴포지팅을 시도해 볼 수 있어요. 이젠 슬슬 고여서 퇴장할 준비를 하고 있는 인텔 DDX 드라이버를 설치한 후 2D 가속 데스크탑을 즐겨보세요!

Sn   [ + ]

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.