비스타와 창 내용의 깜빡임

Capture

윈도우 같은 GUI 운영체제에서 위 그림과 같이 창들이 서로 겹치는 것은 매우 당연한 기능 중 하나이다. 그러나 최초의 윈도우 1.0에서는 이런 기능이 지원되지 않았다. 버전 2.0부터 이렇게 윈도우들이 서로 겹치는, 즉 overlapped 될 수 있었다. Win32 API를 사용한 분들은 WS_OVERLAPPED (WS는 Window Style의 약자)라는 #define을 본 적이 있을 것이다. 이렇게 창들이 오버랩 되는 것이 하나의 특별한 기능으로 간주되던 시절이 있었다.

이 겹쳐지는 윈도우들의 구현 중 핵심은 가려진 부분을 다시 그릴 수 있는 메카니즘일 것이다. 위 그림처럼 노트패드 위에 탐색기가 있고 탐색기를 다른 곳으로 보내면, 노트패드의 가려졌던 부분은 어떤 방식으로도 다시 그려져야만 한다. 이 기능을 구현하기 위해서는 크게:

  1. 다른 윈도우가 나를 덮을 때, 내 화면 정보를 메모리에 보관하고 있다가 복원한다.
  2. 다른 윈도우가 나를 덮고 있다가 사라졌을 때, 그 부분만큼 새롭게 그린다.

이 정도의 방법이 있다. 보다시피 메모리를 써가며 빠르게 복원을 시킬 것인가, 아니면 메모리를 아끼지만 복원에는 다소 시간이 걸리는 것이냐의 전형적인 시간과 공간의 tradeoff인 것이다.

윈도우의 경우에는 이 두 가지 방법 모두를 사용한다. 방법 1은 바로 마우스 커서가 윈도우 창들을 움직일 때 사용한다. 마우스 커서가 차지하는 부분은 많아봐야 32x32 픽셀이므로 메모리에 화면 내용을 저장해도 부담이 되지 않는다.

그러나 일반적인 창들의 복원은 방법 2을 이용한다. 가려진 부분을 새로 그리라는 메세지를 운영체제가 해당 어플리케이션에게 보냄으로써 구현이 된다. 즉, 화면 내용을 별도의 메모리에 기억하지 않는다. 그러기에는 너무 많은 메모리가 필요하다. 그래서 윈도우 프로그래밍 공부하신 분들이라면 너무나 잘 아는 WM_PAINT 메세지를 이용하여 이것을 구현한다. (WM_은 Windows Message의 약자이다)

paint

위 그림에서 탐색기를 최소화 시킨다고 하자. 그러면 노트패드의 가려졌던 부분은 다시 복원이 되어야한다. 이 때, 윈도우 운영체제는 이 복원이 되어야하는 영역을 무효화한다. 그리고 이 무효화한 영역을 최소한으로 감싸는 사각형 정보 (위 그림에서는 10, 40부터 400, 300까지) 를 WM_PAINT 메세지와 함께 노트패드에게 보낸다. 그러면 노트패드의 WM_PAINT 메세지를 처리하는 함수는 이것을 받아 적절히 해결해야 한다. 이것이 전통적인 윈도우 운영체제의 겹쳐지는 창들을 구현하기 위한 일반적인 방법이다.

(사실 윈도우 프로그램의 본질은 매우 간단한데, 윈도우 운영체제가 보내는 각종 윈도우 메세지 WM_*에 대응되는 콜백함수, 즉 Windows Procedure를 제공하는 것이다.)

WM_PAINT는 이 경우 뿐만 아니라 최초로 윈도우가 그려질 때, 창 크기가 변화될 때 등 매우 수시로 불려지는 메세지다. 1초에도 수십번이 불릴 수 있다. 그래서 이 메세지는 최적화에 늘 신경을 써야한다. 이 부분을 그냥 대충 짜면 창 크기를 변화 시킬 때 마다 깜빡인다거나 CPU를 엄청나게 먹는 불상사가 발생한다.

과거 이런 프로그램들을 적지 않게 보았을 것이다. 단순히 다른 윈도우가 특정 프로그램 위를 움직이게 하는 것만으로도 그 프로그램의 전체 화면이 껌뻑이며 새로 그려지는 것을 본 적이 있을 것이다. 무효화된 영역을 특별히 고려해서 그 부분만 그려도 되는데 그냥 귀찮아서 모든 화면이 새롭게 그렸기 때문이다. (사실 껌뻑임의 가장 큰 이유는 WM_PAINT 이전에 화면을 지우라는 WM_ERASEBKGND라는 메세지를 제대로 처리하지 않아 발생하는 것이기는 하다.)

그러나 이제는 메모리가 가장 싼 컴퓨터 자원이 되고 말았다. 주기억장치뿐만 아니라 그래픽 카드의 메모리도 엄청나게 발전하였다. 2001년만 하더라도 비디오램은 고작 4~32MB 수준이었지만 이제는 128MB, 256MB도 그렇게 비싸지가 않다. 2008년 1월 13일 다나와 기준.

image

1GB 메모리가 이제 2만원도 하지 않는다.

image

256MB짜리 그래픽 카드도 단 돈 10만원.

비스타에서 도입된 Aero 기능, 보다 프로그래머틱하게 말하면 Desktop Windows Management에서는 이런 저렴해진 메모리를 적극적으로 활용한다. 창의 내용을 복원할 때도 이제 그래픽 카드의 메모리에다 몽땅 올려다 놓는다. 그래서 각 창들의 화면을 그 다음에 합성을 하여 여러 3차원 효과 등을 구현할 수 있다.

그렇다면 WM_PAINT 메세지는? 위에서 예로 든 노트패드와 탐색기 예에서 더 이상 탐색기가 치워져도 노트패드에 WM_PAINT 메세지가 불려지지 않는다. 직접 간단히 프로그램을 만들어놓고 테스트를 해보니 단순히 창을 최소화 및 복원, 그리고 다른 창에 의해 가려졌다가 다시 보여질 때는 힘들게 다시 그리지 않고 그대로 메모리의 내용을 가지고 복원을 한다. 따라서 과거 아무 생각없이 프로그램을 짜서 껌뻑이던 프로그램도 비스타에서는 잘 작동할 수 있게 되었다. 물론, 비스타에서도 Aero 기능을 끄고 (즉, dwm.exe가 사라지면) 테스트를 해보면 과거 XP 시절과 같이 끊임없이 WM_PAINT 메세지가 발생한다.

나는 꼼꼼한 윈도우 프로그래머를 가늠하는 기준 중 하나가 창이 복원되거나 크기가 변경될 때 그 프로그램이 얼마나 잘 반응하는가였다. 얼마나 WM_PAINT 메세지 핸들러를 잘 만들었냐를 보는 것이었다. 그러나 메모리 가격이 엄청나게 저렴해지고 운영체제도 발전함에 따라 이런 기준은 이제 무의미하게 되었다.

@ WM_PAINT 메세지 뿐만 아니라 다른 메세지 처리도 잘 해야만한다. 만약 특정 시간 동안 (보통 5초) 메세지 처리를 마치지 못하면 흔히 보는 "응답 없음"이라는 상태로 창 상태가 바뀌게 된다.

@ 비스타에서 프로그램을 좀 만들다가 WM_PAINT 메세지가 발생하지 않음을 보고 신기해서 적어본 글. 역시 프로그래머가 실력있고 없음은 척박한 환경과 자원에서도 잘 돌아가는 프로그램을 짜는 능력인가?

by object | 2008/01/13 23:07 | 컴퓨터 | 트랙백 | 핑백(1) | 덧글(10)
트랙백 주소 : http://minjang.egloos.com/tb/1697583
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at art.oriented : 락.. at 2009/05/11 08:53

... 쳐 난다. 그런데 또 이렇게 기술의 발전으로 이런 고민을 들 수 있게 된다. 분명 바람직한 일이지만 역시 프로그래머는 대충 해도 되는 직업??!!한 줄 요약: 멀티스레드 프로그래밍을 좀 더 (혹은 매우) 쉽게 해주는 TM이라는 게 곧 실용화 될 것 ... more

Commented by 파파울프 at 2008/01/13 23:32
좀 다른 말입니다만 지금 막 윈도우 비스타를 다시 깔고 고전 스타일의 화면으로 바꾸어 봤습니다만 확실히 비스타는 에어로 화면에 맞추어져 다른 것은 별로 고려를 하지 않았나봐요. 고전 화면은 그야말로 엉망 진창이었습니다. 해서 다시 에어로 화면으로 돌아왔네요. 노트북이라 좀 더 가볍게 쓰려고 했던건데...
Commented by Sikuru at 2008/01/13 23:35
비스타는 또 저런 부분의 차이도 있군요. =)
Commented by 미친병아리 at 2008/01/14 00:35
이 글을 읽다 보니..
우어~ 비스타가 확실히 화면이 이쁘긴 이쁘네요..
비스타에서는 뭔가바뀌어도 많이 바뀌었군요.. 예전과 별로 달라진게 없어졌을거라 생각했던 사람에게 WM_PAINT 메시지가 발생하지 않는다는 것은 정말 당황스런 내용이군요..
Commented by object at 2008/01/14 02:45
파파울프님 말씀대로 비스타에서는 고전 스타일로 바꾸면 더 느려집니다;; 그게 좀 설명하자면 복잡한데 비스타의 그래픽 드라이버가 좀 많이 바뀌었습니다. 상당수가 커널모드에서 유저모드로 넘어와서 (그래서 그 만큼 블루스크린 뜨는 일이 줄었죠) 고전 모드에서는 오히려 많이 느려지는 것 같습니다. 에어로가 훨씬 빠르게 돌아갑니다.

저는 XP 안 쓴지 벌써 1년이 넘었고 단 한 번도 XP를 다시 써야지라고 생각해본 적이 없습니다. 달라진 것 무척 많습니다. 그런데 WM_PAINT 메세지가 발생하지 않는 것은 당연히 아니구요. 예전 같으면 다시 그림을 그려서 복원했던 경우도 이제는 그냥 바로 메모리에서 가져와도 되니까 WM_PAINT 메세지의 빈도가 줄어든 정도입니다.
Commented by 랜덤여신 at 2008/01/14 17:25
그것 참 재밌군요. WM_PAINT 같이 당연하다고 생각한 메시지도 줄일 수가 있군요. 역시 기술의 발전은 놀라워요~ 이러다가 우리 후손(?)은 WM_PAINT라는 메시지의 존재마저 모를 날이 오지 않을까 싶군요. 흥미로운 글 잘 봤습니다.
Commented by 오스카 at 2008/01/14 23:45
언젠가는 Dirty Region Update도 사라지고, GDI도 추억속으로... 데스크탑 영역 전체를 GPU에서 프로세싱 할 날이 오겠죠. 화면간 전환에 글로우 먹이고 라이트 맵 깔고~ 에어로 Shader 버전! ㅋ
Commented by object at 2008/01/15 00:41
이미 DWM이 데스크탑 내용을 전부다 GPU를 통해 콤포지션 해주고 있습니다 ㅎㅎ.. 아.. 세상이 참 좋아지네요.
Commented by Glradios at 2008/01/25 02:09
  저는 이곳에서 늘 '프로그래밍이란 무엇인가'를 배워가는 듯한 느낌입니다. 프로그래밍 언어는 어느 책에서나 일반 산술에 필요한 함수를 늘어뜨려놓고 한 번씩 실험하게 합니다. 저는 어렸을 적에 프로그래밍을 배우고 싶었지만, 결국 그런 책에서 아무런 무언가 방향성도 찾아내질 못했습니다. 저런걸 이용하는게 알고리즘이고 컴퓨터 프로그램을 움직이게하는 것이다. 그래서 프로그래밍 경시 대회가 있다는 말은 수없이 들었지만, 어디에 쓰이느지도 모르겠는 쥐가 길을 찾는 알고리즘같은 거산 수백개 보고 있자니 미궁에만 빠지는 기분이었습니다. 저는 단지 운영체제와 소프트웨어가 우리에게는 손 하나 까딱이지만 그 기반에서는 그런 것처럼 모습을 보여주기 위해 움직일 수많은 연산과 그 기반이 되는 엔진, 엔진의 구동은 어떻게 되는걸까가 궁금했지만 그런 것을 위해 제가 어떻게 배워나갸할 지를 가르쳐 준 책이나 교사도 없었지요. 그리고 저는, 여기서 이 단어 쓰면 남 핑계 대는 것 같지만 아니 사실이지만, 결국 저는 프로그래밍은 하나도 할 모르고 스크립트 따위나 간신히 볼 줄 아는 사람이 되었습니다. 그런데, 저와 같은 학교를 나왔던 친구는 그닥 책을 따라가면서 공부하지 않고 이것저것 뒤적거리면 만들어보고 싶은 소소한 프로그램을 만들더니만 지금은 ICU에 있습니다.
  그리고 저는 지금 오프젝트님에게서 "이런게 프로그래밍이다"라고, 무능해서 착각인지는 모르겠지만(자기비하가 아니라 객관적으로), 지금까지 아무도 알려주지 않았던 진짜 프로그래밍이 하는 일이 무엇인지, 인간이 프로그래밍과 핵에 흥분하는 이유를 알 것만 같습니다.
Commented by Glradios at 2008/01/25 02:13
  오브젝트님에게는 재미난 이야깃거리 정도 겠지만, 저같은 사람에게는 분명 주옥같은 글인게 분명해요. 언제까지나 오브젝트님의 재밌는 거리의 얘기를 계속 읽을 수 있기를 바랄 뿐입니다. 이힝..
Commented by 21세기 at 2008/03/25 19:12
얼마전에 회사에서 발견한 내용과 상통하는군요. :)
요즘 윈도우즈와 정붙일려고(왠지 정이 떨어지고있는;;;) "윈도우즈 API 완전정복 개정판"을 다시 뜯어보고 있던 찰라였지요.3장 출력 부분을 달리고 있다가.. 그냥 넘어갈까하다가 우연히 창을 겹치게 되었는데 출력된 글자가 안지워지더라구요 >.< 신기하더라구요 ㅎㅎ 블로그에 올려야지 올려야지 하다가 이글 보네요 :D

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by object 2008 이글루스 TOP 100
최근 등록된 덧글
최근 등록된 트랙백
민영의 생각
by kkung's me2DAY
IT분야에서, 일이 더딘 사..
by Effortless - 上善若水 - ..
메뉴릿

한RSS 구독자수 website counter

한RSS에 추가

Add to Google

rss

skin by 이글루스