더블 버퍼링(double buffering)은 자주 쓰이는 기술이다.
그림을 그릴 때(화면에 표현) 우리는 도화지(canvas)에 그리고자 하는 대상(이미지, 선, 도형..)을 그리게 되는데
게임 또는 빈번하게 화면이 변경되는 경우에는 위 방식을 사용하면
1. 화면에 도형을 그린다.
2. 화면을 지운다(reset)
1, 2의 반복이 된다. 이 경우, 화면에는 잔상 또는 깜빡임이 발생한다.
이러한 현상을 막기 위해 더블 버퍼링을 쓴다.
더블 버퍼링은 직접 화면에 그림을 그리기 전에 백 버퍼(back buffer)공간에 그려야 하는 이미지들을 먼저 그리고
화면 버퍼(front buffer)와 백 버퍼(back buffer)의 교환으로 화면에 이미지를 그리는 기술이다.
이 때, 버퍼간의 교체는 매우 빠르고 효율적이기 때문에 기존의 화면에 그리는 방식보다 효율적이다.
언어마다 표현은 다르지만 MFC에서는 아래와 같이 사용한다.
OnDraw()
{
CClientDC dc(this);
CRect Rect;
GetClientRect(&Rect);
CDC memDC;
CBitmap * pOldBitmap,bmp;
memDC.CreateCompatibleDC(&dc);
bmp.CreateCompatibleBitmap(&dc,Rect.Width(),Rect.Height());
pOldBitmap = (CBitmap*)memDC.SelectObject(&bmp);
memDC.PatBlt(0,0,Rect.Width(),Rect.Height(),WHITENESS);
DrawImage(&memDC);
dc.BitBlt(0,0,Rect.Width(),Rect.Height(), &memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}
화면 dc에 직접 그리는게 아닌 memDC(메모리 dc)에 DrawImage( )로 이미지를 그린뒤 BitBit 메소드로 memDC에 그려진 이미지를 dc에 그린다.
단, 더블 버퍼링을 구현한 뒤
BOOL CTest2View::OnEraseBkgnd(CDC* pDC)
{
//FALSE도 가능하다.
return TRUE;
//return CView::OnEraseBkgnd(pDC);
}
OnEraseBkgnd 메소드를 호출하여 사용하지 않아야한다.
참고 : http://jurang5.tistory.com/21
'알고리즘' 카테고리의 다른 글
다각형에 특정 점 포함 유무선별 (0) | 2015.06.13 |
---|---|
사각형 그리기 (0) | 2015.02.13 |
임의의 순서로 이루어진 순열 얻기 (0) | 2015.02.10 |
현재 화면에 맞춰 이미지 크기 변경 (0) | 2015.02.10 |
XOR 교체 알고리즘 (0) | 2015.01.29 |