[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++] 더블버퍼링..
'프로그래밍 > C,C++' 카테고리의 다른 글
[C, C++] 문자열 관련 함수 ( strlen, strcpy, strcat, strcmp ) (2) | 2011.10.12 |
---|---|
[C,C++] memset, memcpy 함수 사용법! (6) | 2011.10.11 |
[C,C++] 함수 오버로딩(Function Overloading) (0) | 2011.09.15 |
[C,C++] 디폴트(DeFault) 매개 변수 (0) | 2011.09.14 |
[C,C++] 이름공간(namespace) (0) | 2011.09.14 |