알고리즘

더블 버퍼링

조규현15 2015. 2. 12. 17:12
반응형

더블 버퍼링(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

반응형