본문 바로가기
WIN32 API

[WIN32 API] 더블 버퍼링(Double Buffering)

by Junk_Seo 2018. 5. 3.
반응형

더블 버퍼링

win32 API에서 비트맵 파일을 화면에 뿌려줄 때, 계속해서 그리는 작업을 반복하기 때문에 비트맵 이미지가 깜빡이는 현상이 나타나게 됩니다.

이런 현상을 해결하기 위해서 더블버퍼링이라는 방법을 사용해야 합니다.

더블 버퍼링이란 메모리 공간 내에서의 출력이 더 빠르다는 점을 이용하여 메모리에 모든 출력 내용을 저장한 뒤 메인 HDC로 옮기는 기술입니다.

, 매번 출력 내용을 화면에 바로 그리지 않고, 그릴 내용을 버퍼에 다 그려준 뒤 이 버퍼를 화면에 그려주는 것입니다.

 

그림으로 보자면 다음과 같습니다.

 

[그림 출처 : http://movefast.tistory.com/6]

 

코드

API에서 더블 버퍼링을 어떻게 사용하는지 코드를 보면서 설명하겠습니다.

전체 코드는 마지막에 압축파일로 제공(?)하겠습니다.

void C_MYWIN::updateMsg()
{
	MSG msg = {};
	while (true)
	{
		while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		if (msg.message == WM_QUIT)
		{
			break;
		}

		//업데이트
		if (m_arKeyEvent[VK_LEFT]) {
			m_fPosX -= 0.1f;
		}
		if (m_arKeyEvent[VK_RIGHT]) {
			m_fPosX += 0.1f;
		}
		if (m_arKeyEvent[VK_UP]) {
			m_fPosY -= 0.1f;
		}
		if (m_arKeyEvent[VK_DOWN]) {
			m_fPosY += 0.1f;
		}

		HDC hDcMain = GetDC(m_hWnd);


		//랜더 로직
		HDC hdcBuffer = CreateCompatibleDC(hDcMain);
		HDC hdcBackGround = CreateCompatibleDC(hDcMain);
		HDC hdcChar = CreateCompatibleDC(hDcMain);
		HDC hdcEnemy = CreateCompatibleDC(hDcMain);

		SelectObject(hdcBuffer, m_hBmpBuffer);
		SelectObject(hdcBackGround, m_hBmpBackGround);
		SelectObject(hdcChar, m_hBmpChar);
		SelectObject(hdcEnemy, m_hBmpEnemy);

		GetObject(m_hBmpBackGround, sizeof(BITMAP), &m_btSize);
		BitBlt(hdcBuffer, 0, 0, m_btSize.bmWidth, m_btSize.bmHeight, 
				hdcBackGround, 0, 0, SRCCOPY);
		
		GetObject(m_hBmpChar, sizeof(BITMAP), &m_btSize);
		BitBlt(hdcBuffer, (int)m_fPosX, (int)m_fPosY, m_btSize.bmWidth, 
				m_btSize.bmHeight, hdcChar, 0, 0, SRCCOPY);

		GetObject(m_hBmpEnemy, sizeof(BITMAP), &m_btSize);
		BitBlt(hdcBuffer, (int)m_fPosX+100, (int)m_fPosY+100, m_btSize.bmWidth, 
				m_btSize.bmHeight, hdcEnemy, 0, 0, SRCCOPY);

		GetObject(m_hBmpBackGround, sizeof(BITMAP), &m_btSize);
		BitBlt(hDcMain, 0, 0, m_btSize.bmWidth, m_btSize.bmHeight, hdcBuffer, 0, 0, SRCCOPY);
		
		DeleteDC(hdcChar);
		DeleteDC(hdcBackGround);
		DeleteDC(hdcEnemy);
		DeleteDC(hdcBuffer);


		ReleaseDC(m_hWnd, hDcMain);
	}
}

위 코드는 API에서 메시지를 처리하는 부분입니다. 

여기서 GetDC() ~ ReleaseDC() 사이에서 더블버퍼링을 처리하고 있습니다.

여기서 hdcBuffer에 출력해야할 비트맵을 모두 그린다음 hdcMain에 복사하여 출력하고 있습니다.

즉, 빈 비트맵 위에 출력해야할 모든 비트맵을 그린 다음 화면에 한번에 출력하는 것입니다.

 

전제코드 : 

WIN32APIClassBasic - doubleBuffering.7z
다운로드

 

 

 

 

 

 

 

 

 

반응형

'WIN32 API' 카테고리의 다른 글

[WIN32 API]기본 class 작업  (1) 2018.04.25
[WIN32 API]HINSTANCE와 자료형 의미 설명  (0) 2018.04.25
[WIN32 API]기본 API 정리 및 코드 설명  (0) 2018.04.25