더블버퍼링
- 싱글 버퍼링으로 화면을 그릴 경우 화면을 다 그리기 전까진 다음 그림을 그릴 수 없기 때문에 깜빡이는 문제점 이 발생합니다. 이 문제는 (화면출력 -> 초기화 -> 화면출력)를 반복하며 초기화 부분에 순간을 포착해서 생김
- 위에서 발생하는 깜빡임 문제를 해결하기 위해 사용되는 기법
- 버퍼 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 |