[C,C++] 더블버퍼링..

더블 버퍼링이라는 개념은 흔히 게임과 관련되거나, 실시간으로 화면 처리가

필요할 떄 사용된다..

쉽게 설명하면, 그림이나 도형 하나 하나를 그릴 때 보여지는 화면에 바로바로

그려버리면, 흔히 얘기하는 깜빡이는 현상이 생긴다.

그 것을 방지 하기 위해서는 더블 버퍼링을 사용하는데 말 그대로 버퍼가 2개

(더블) 이라는 의미이다.

즉, 화면에 보여지는 버퍼 하나와 화면에 보이지는 않지만 실제로 그림이 찍히

는 백버퍼 2개의 버퍼가 존재하는데 일단 백버퍼에 모든 그림을 그리고, 마지막

에 화면 버퍼에 백 버퍼를 복사하는 방식이다.

(물론, 2개의 버퍼를 클리핑 하면서 사용할 수도 있다. 개념적으로는 같은 방식

이다.)

개념자체도 어렵지 않은 만큼 소스도 어렵지 않다...

아래의 소스는 mfc에서 테스트 했지만, hdc를 사용하기 때문에, c++환경의 api

든 mfc든 모두 사용할 수 있을 것이다.

HDC backMemDC ;
 
backMemDC = CreateCompatibleDC(pDC->GetSafeHdc());

위와 같이 백버퍼를 하나 선언한다... 물론 기본적으로 프론트 버퍼도 있어야

하는데, mfc에서 지원하는 pDC에서 hdc를 받아온다.

그 후에..

RECT rect ;
GetClientRect(&rect) ;


HBITMAP MemBmp;
MemBmp = CreateCompatibleBitmap(pDC->GetSafeHdc(),rect.right,rect.bottom);

SelectObject(backMemDC,MemBmp);

화면의 크기를 얻기 위해 rect를 선언하였고,

비트맵을 하나 만들고, 2개를 연결 시킨다...

오랜만에.. 더블버퍼링에 대해서 개념만 가지고 그냥 코딩했더니.....

저 비트맵 부분을 빼먹었었다.. 아무런 오류없이 컴파일이 끝났지만,

실제 화면에는 아무것도 찍히지 않았다 ;;

그래서 검색해보니 저 비트맵을 누군가 도화지라고 표현해놓았는데..

그 것을 보고 비트맵을 추가했더니, 역시나 제대로 나온다...

즉, 더블버퍼링에 필요한 것은 백버퍼와 그 곳에 그림이 그려질 도화지 역할을

하는 비트맵이 필요했다..

이제 저 이후에,

MoveToEx(backMemDC, 100, 100, NULL ) ;
LineTo(backMemDC, 300, 300) ;

이런식으로 선을 긋든, 원, 사각형을 그리고, 마지막으로...

BitBlt(pDC->GetSafeHdc(),0,0, rect.right, rect.bottom, backMemDC, 0,0, SRCCOPY);

으로 화면을 백버퍼에 있던 내용을 프론트로 복사하면 된다...

DeleteDC(backMemDC);
DeleteObject(MemBmp);

그리고 잊지말고, 해제도 꼭 하기!

[C,C++] 더블버퍼링..[C,C++] 더블버퍼링..[C,C++] 더블버퍼링..




Posted by 바람처럼..
|