본문 바로가기

IT

Vista의 새로운 API : 데스크톱 창 관리자

저번에 쓰겠다고 해놓구선 이런저런 바쁜 일이 많았던 관계로 이제서야 쓰게 되었다. Vista에서 일반 사용자들이 보기에 가장 달라진 것은 뭐니뭐니해도 화려한 Aero Glass 테마일 것이다. 이 테마를 적용하면 창 가장자리가 투명해지고 그 뒤에 있는 내용물이 부드럽게 blur되어 보이는 효과가 나타난다. 또한 창에 그림자도 생기며, 작업 표시줄 버튼에 마우스를 가져다 대거나 Alt+Tab을 누르면 각 창들의 썸네일(그것도 실시간으로 갱신되는)도 볼 수 있다. Window+Tab을 누르면 창들이 비스듬하게 늘어서는 Flip3D 효과도 있다.

이것들이 가능해진 이유는 이전의 Windows와 화면 렌더링 방식이 완전히 달라졌기 때문이다. Vista의 Aero Glass는 기본적으로 3D 모드로 동작한다. Flip3D를 써보면 알겠지만 동영상이 돌아가는 창이든 게임 화면이든 그대로 실시간으로 갱신되면서 3D로 비스듬하게 늘어서는 것을 볼 수 있다. 이것은 창 표시 자체가 3D로 이루어지고 있다는 것을 뜻하며, 그래픽카드에서 행렬 연산을 한 번 더 해주는 것이라고 볼 수 있다. (평상시의 2D 화면도 알고보면 3D 평면들을 모니터와 평행하게 둔 것이다.)

좀더 구체적으로 들어가보면, Windows XP까지는 창을 렌더링할 때 윈도우에서 WM_PAINT 메시지를 일일이 날려주었다. GDI라는 Win32 API를 통해 창에 그림을 그리면 윈도우가 이를 그래픽카드의 framebuffer에 바로 표시해주는 방식이었고, Windows 2000에서 반투명 창(Layered Window)이 소개된 후 Windows XP로 넘어오면서 테마 기능이 생겼지만 모두 CPU 연산에 의존하는 형태였다. 그러나 Vista에서는 각 프로그램이 GDI를 통해 각자의 창에 그림을 그리면 그것이 바로 화면에 뿌려지는 것이 아니라 off-screen buffer에 저장된다. Vista의 데스크톱 창 관리자(Vista의 작업관리자를 보면 dwm.exe라는 프로세스)는 이 off-screen buffer를 읽어서 3D 가속 기능을 활용해 Aero Glass 테마와 같은 비주얼 효과를 내는 것이다.

이 방식을 이용함으로써 생기는 추가적인 장점은 창을 드래그할 때 극명하게 나타난다. 뒤에 다른 창이 있을 때 앞쪽에 놓인 창을 드래그해 옮기면, 뒤에 있는 창의 가려졌던 부분을 다시 표시하기 위해 윈도우에서 WM_PAINT 메시지를 매번 날려주게 되는데, 이것이 CPU에 꽤 많은 부하를 주었다. Windows 2000 이후 소개된 Layered Window 개념으로 인해 이를 좀더 부드럽게 처리하게 되기는 했지만 뒤에 있는 창이 응답하지 않을 경우 앞에 있는 창의 잔상이 그대로 남는 현상을 볼 수 있었다. 그러나 Vista에서는 그럴 필요가 아예 없다. 창을 드래그하는 것은 화면에 표시되는 창의 위치를 바꾸는 것이므로, off-screen buffer에서 읽어들인 해당 창의 내용을 다른 위치에 렌더링하기만 하면 되는 것이다. (그 뒤에 있는 창의 내용도 buffer에 들어있으므로 그 창에게 WM_PAINT를 날려줄 필요가 없다. 따라서 매우 부드러운 창 이동이 가능하다. 이 외에도, 수직동기와 같은 3D 가속 기능들을 활용할 수 있다는 장점이 있다.)

다만, off-screen buffer들을 합성하여 화면에 출력하는 과정이 그래픽카드의 성능에 영향을 받기 때문에 일반적으로 1초에 30~60회 이상 수많은 창들의 내용을 합성해서 화면을 만들어내야 하는 Vista가 높은 사양을 요구하게 되는 것이다. (기존의 렌더링 방식에서는 애초부터 3D가 아니기 때문에 각 프로그램이 창을 갱신하는 속도가 곧 렌더링 속도였지만 데스크톱 창 관리자(DWM; Desktop Window Manager) 방식에서는 거기에 화면을 합성·렌더링하는 시간이 추가되는 것이다.)

DWM에서 제공하는 API를 여기서 자세히 설명하지는 않겠지만, 대표적으로 Vista의 탐색기나 IE와 같이 non-client area 영역이 아닌 창 내부까지 일정 영역을 투명하게 만드는 것, 화면 전체의 DWM 적용 여부를 알아내거나 설정을 바꾸는 것, 창의 핸들값을 이용해 썸네일을 얻어오는 것 등이 있다. 보다 자세한 설명은 역시 MSDN을 참조하는 것이 빠를 것이다.

사실 이러한 off-screen buffer composition 방식의 창 렌더링은 이미 매킨토시에서 구현되어 있었다. MacOSX의 부드러운 그림자, 창 최소화 효과 등이 나올 수 있는 이유가 바로 이것이었던 것이다. Vista에서는 다소 늦게 도입이 되긴 했지만 3D 카드의 성능을 십분 활용할 수 있게 된 것이다.