본문 바로가기
C++/WinAPI

[WinAPI] DC, BITMAP, 더블버퍼링

by sihyeong 2022. 11. 15.

더블버퍼링

  • 싱글 버퍼링으로 화면을 그릴 경우 화면을 다 그리기 전까진 다음 그림을 그릴 수 없기 때문에 깜빡이는 문제점         이 발생합니다. 이 문제는 (화면출력 -> 초기화 -> 화면출력)를 반복하며 초기화 부분에 순간을 포착해서 생김
  • 위에서 발생하는 깜빡임 문제를 해결하기 위해 사용되는 기법
  • 버퍼 2개로 렌더링 처리를 하는 것 입니다.
  • 한쪽은 보여주고 한쪽은 화면을 그리고 화면을 다 그렸다면 보여주고 반대편은 다시 그리고 이 동작을 반복한다면 깜박임 문제를 해결할 수 있습니다.

 

DC 

  • 출력에 필요한 모든 정보를 가지는 구조체, 모든 출력함수는 DC를 참조하여 출력한다.
  • 출력을 하기 위해 DC를 사용해야한다.
HDC hdc = GetDC(hwnd);
  • GetDC()로 DC 받아오고
ReleaseDC(hwnd, hdc);
  • 사용이 끝나면 ReleaseDC()로 해제한다.
memDc = CreateCompatibleDC(hdc);
  • 해당 dc와 호환되는 dc를 생성한다. hdc가 사용하고 있는 출력장치의 종류, 출력장치가 사용중인 그래픽 드라이버 정보를 가지고 새로운 DC를 생성한다는 뜻이다.
  • CreateCompatibleDC()의 기본 비트맵은 1픽셀짜리 비트맵을 가지고 있다. 따라서 원하는 픽셀만큼의 비트맵을 사용할 수 있도록 교체 해야한다.
DeleteDC(memDC);
  • CreateCompatibleDC()로 생성한 DC는 DeleteDC()를 통해 삭제해야 한다.

 

BITMAP

  • 비트맵은 디티렁 이미지를 어떠한 형식을 가지고 저장된 리소스를 뜻한다.
  • 픽셀 덩어리 라고 생각하면 된다. 크기만큼의 픽셀 정보를 가지게 된다.
  • 한마디로 원하는 이미지나 화면의 픽셀정보를 가지고 있는 캡처본이라 생각하면 된다.
bitmap = CreateCompatibleBitmap(hdc, x크기, y크기);
  • CreateCompatibleBitmap()을 통해 기존 메모리와 양립하는, hdc가 사용하고 있는 비트맵과 동일한 특성을 가지고 내부에 출력 표면을 가진 메모리 영역을 생성해 가져오게 된다.
  • 가져온 bitmap은 SelectObject(hdc, bitmap);을 통해 사용할 수 있다.
BitBlt(m_hDC, 0, 0, 100, 100,
		m_memDC, 0, 0, SRCCOPY);
// hDc의 0,0부터 100,100까지의 비트맵에 
// memDC의 비트맵의 0,0의 값부터 hdc에 복사한다.
  • dc 끼리 비트맵을 복사하는 기능이다. 메모리dc(뒷장의 스케치북)에 그림을 그렸으니 hdc(제일 앞의 스케치북)으로 옮겨야 볼 수 있다.

 

더블버퍼링 구현

m_hDC = GetDC(m_hWnd); // DC 생성

m_hBit = CreateCompatibleBitmap(m_hDC, m_ptResolution.x, m_ptResolution.y);	
// hdc가 가진 비트맵과 동일한(호환되는) bitmap 생성
m_memDC = CreateCompatibleDC(m_hDC);
// hdc와 동일한(호환되는) DC 생성

// 버퍼dc가 hdc와 동일한 환경을 가지기 위해 bitmap 세팅(동일한 크기의 스케치북 사용)
HBITMAP hOldBit = (HBITMAP)SelectObject(m_memDC, m_hBit);
DeleteObject(hOldBit);
    
Rectangle(m_memDC, 0, 0, 100, 100); // 버퍼dc에 그림 그리고

BitBlt(m_hDC, 0, 0, m_ptResolution.x, m_ptResolution.y,
		m_memDC, 0, 0, SRCCOPY);	// 버퍼dc의 값을 hdc에 복사한다.
        
// 메모리 해제
ReleaseDC(m_hWnd, m_hDC);
DeleteDC(m_memDC);
DeleteObject(m_hBit);

'C++ > WinAPI' 카테고리의 다른 글

[WinAPI] sound  (0) 2022.12.17
[WinAPI] 키 입력 관리  (0) 2022.11.15
[WinAPI] 윈도우 크기 지정  (0) 2022.11.15
[WinAPI] 그리기  (0) 2022.11.13
[WinAPI] Win32API 기본  (0) 2022.11.13