한명의 화가가 캔버스에 풍경화 그림을 그리려고 합니다.
그림에는 산과 바다, 꽃과 나무, 기타동물, 그리고 자연속을 유유히 산책하며 걸어다니는 인물들 모두를 포함하여 그리려고 합니다.

이 화가가 그린 풍경화를 감상하고자 할때 그 그림을 감상하는 사람들은 그 그림의 결과만을 보고 감상하지만 화가가 만들어낸 풍경화의 결과 이전에는 화가의 굉장히 불연속적인 그리기 동작이 반복됩니다.

우리는 그 그림의 결과..즉 다 그려진 한폭의 풍경화를 감상하기를 원하지 화가의 지속적인 그리기 과정을 보고 싶어하지 않습니다.
뭐 그런걸 보고싶어하는 사람이 있을지 모르겠으나.. -_-; 그런분은 논외로 치고..

이 개념을 그대로 프로그래밍에 접목 시키면 더블버퍼링의 원리를 쉽게 이해할 수 있습니다.
비유가 적절한지는 모르겠지만.. -_-;

화면에 각종 이미지, 도형, UI 컨트롤등을 표현하고자 할때 Windows Application은 화면 DC(Device Context)에 그리기 동작을 수행합니다.
DC란 Device Context를 의미하며 그림을 그리고자 하는 캔버스의 의미로 생각하면 쉽습니다.
이러한 각각의 불연속적인 그리기 동작을 수행하고 Application이 이를 표출하는 과정에서 화면을 보는 사용자의 입장에서는 그리기 동작이 모두 끝나기 전까지 지속적인 화면 깜빡임 현상을 보게 됩니다.

이런 현상을 방지하기 위한 작업이 더블버퍼링입니다.
더블버퍼링의 기본원리는 직접적으로 표출되는 화면DC에 직접 그리는것이 아닌 가상의 메모리DC를 만들어 메모리DC에 모든 그리기 동작 수행후에 이를 화면 DC에 복사하는 원리입니다. 화면에 나타나지 않는 메모리 DC에 그림을 다 그리고 다 그려진 그림의 결과물(메모리DC)만을 화면에 복사하는 방식이니까 그리는 과정에서 나타나는 화면 깜빡임등의 현상은 나타나지 않겠네요.
<MFC 더블버퍼링 예시>

MFC 더블버퍼링 샘플입니다.
원리를 알면 매우 간단한 코드이고 또한 MFC 프로그래밍에서 지속적으로 사용되는 개념이라 두고두고 활용될거 같아 블로그에 포스팅합니다.


Posted by 루시엔시엘

댓글을 달아 주세요

  1. 푸우 2011.02.22 09:11  댓글주소  수정/삭제  댓글쓰기

    퍼갈께요 ㅎㅎ
    좋은글 감사합니다 ㅎㅎ

  2. 뿡뿡대마왕 2015.02.09 10:30  댓글주소  수정/삭제  댓글쓰기

    음..onpaint에서 처리하는데
    굳이 왜 GetDC를 가져와서 처리하는 거죠?
    CPaintDc가 있는데 말이죠;;;

  3. 대마왕뿡뿡 2018.12.17 18:20  댓글주소  수정/삭제  댓글쓰기

    중간에 DrawImage는 뭔가요