Double Buffering 기술 및 예제 코드
스페이스가족이야기/SW개발이야기및팁
2009/03/27 16:50
Double Buffering이라 함은 그려줘야 하는 부분을 Bitmap으로 우선 만들어서
저장해놓은 후 다시 그릴경우 일일이 다시 그리지 않고 저장된 Bitmap을 이용하여 그리도록 하는 기술입니다.
일일이 다 다시 그릴 경우 리소스의 낭비 뿐만 아니라 화면이 깜빡거림이 발생할 수 있어
CBitmap m_Bitmap;
//아까 그려진 비트멥을 출력하기 위한 부분입니다.
MemDC.SelectObject(pOldBitmap);
이것으로 Double Buffering에 대한 샘플 소스에 대한 설명은 마치겠습니다.
실제 Double Buffering은 일반적을 많이 사용되고
UI 제작을 하실때 꼭 필요한 부분입니다.
(실제 PC가 엄청나게 좋아진다면 필요가 없어질 때도 생기겠지만.. )
저장해놓은 후 다시 그릴경우 일일이 다시 그리지 않고 저장된 Bitmap을 이용하여 그리도록 하는 기술입니다.
일일이 다 다시 그릴 경우 리소스의 낭비 뿐만 아니라 화면이 깜빡거림이 발생할 수 있어
배경이나 랜더링 등 특정영역이 계속적으로 다시 그려져 화면의 이미지가 깜빡거리는 경우가 발생합니다.
예제는 예제일 뿐 너무 똑같이 만들려고 하지 말고..
실제 프로그램에 맞게 사용하면 좋겠네요.. ^^
대략적으로 배경을 Double Buffering으로 배경을 그리는 부분으로 설명드릴께요
예제는 예제일 뿐 너무 똑같이 만들려고 하지 말고..
실제 프로그램에 맞게 사용하면 좋겠네요.. ^^
대략적으로 배경을 Double Buffering으로 배경을 그리는 부분으로 설명드릴께요
변수 선언
// 이미지를 저장할 CBitmap 변수를 전역 또는 클래스의 맴버 변수로 생성
// 실제로 그려질 부분의 비트멥이 저장되는 비트멥 변수CBitmap m_Bitmap;
가상 비트멥 생성
CClientDC dc(this);
//가상 비트멥을 만들기위한 DC(이 가상 DC가 있어야 비트멥을 만들수 있습니다)
CDC MemDC; CRect rect;
CBitmap *pOldBmp = NULL;
//가상 비트멥을 DC에 지정하여 이미지를 그리기 위한 준비 작업
//비트멥의 크기를 지정하고 빈 공백의 비트멥을 만듭니다.
//여기서는 출력한 전체 영역을 지정한 크기 만큼의 비트멥을 만들것입니다
GetClientRect(&rect);//비트멥의 크기를 지정하고 빈 공백의 비트멥을 만듭니다.
//여기서는 출력한 전체 영역을 지정한 크기 만큼의 비트멥을 만들것입니다
m_Bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
MemDC.CreateCompatibleDC(&dc);
pOldBmp = MemDC.SelectObject(&m_Bitmap);
//가상 비트멥에 이미지를 그려넣는 작업
//여기서는 Brush를 이용하여 배경의 색을 칠합니다.
//여기서 배경색만 변경하지만 여기서 실제 Double Buffering으로 출력할 부분의 그림을 그려야 됩니다.
//여기서는 Brush를 이용하여 배경의 색을 칠합니다.
//여기서 배경색만 변경하지만 여기서 실제 Double Buffering으로 출력할 부분의 그림을 그려야 됩니다.
CBrush *pOldBrush;
m_BgBrush.CreateSolidBrush(RGB(122, 122, 122));
pOldBrush = MemDC.SelectObject(&m_BgBrush);
MemDC.PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);
//출력할 비트멥을 모드 그렸을 경우 가상의 DC를 삭제하여야 합니다.
MemDC.SelectObject(pOldBrush);
MemDC.SelectObject(pOldBmp);
MemDC.DeleteDC();
가상 이미지를 출력하는 부분
//OnPaint또는 OnDraw 등등 이미지를 출력하기 위한 부분에서 처리
CRect rc;
CRect rc;
GetClientRect(rc);
//아까 그려진 비트멥을 출력하기 위한 부분입니다.
CDC MemDC;
CBitmap *pOldBitmap = NULL;
MemDC.CreateCompatibleDC(&dc);
//여기에 아까 그려진 비트멥을 넣어줍니다.
//매번 아까 그리는 작업을 반복하였을 경우 계속 출력하다보면
//그려지는 부분이 깜빡거리는 것을 알수 있습니다.
pOldBitmap = MemDC.SelectObject(&m_Bitmap);
//가상의 비트멥 이미지를 출력하는 부분
dc.BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &MemDC, 0, 0, SRCCOPY);
CBitmap *pOldBitmap = NULL;
MemDC.CreateCompatibleDC(&dc);
//여기에 아까 그려진 비트멥을 넣어줍니다.
//매번 아까 그리는 작업을 반복하였을 경우 계속 출력하다보면
//그려지는 부분이 깜빡거리는 것을 알수 있습니다.
pOldBitmap = MemDC.SelectObject(&m_Bitmap);
//가상의 비트멥 이미지를 출력하는 부분
dc.BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBitmap);
이것으로 Double Buffering에 대한 샘플 소스에 대한 설명은 마치겠습니다.
실제 Double Buffering은 일반적을 많이 사용되고
UI 제작을 하실때 꼭 필요한 부분입니다.
(실제 PC가 엄청나게 좋아진다면 필요가 없어질 때도 생기겠지만.. )













댓글을 달아 주세요