본문 바로가기
프로그래밍/공부

[그래픽스] 더블 버퍼링(Double Buffering)

by Sik.K 2022. 12. 12.

WinAPI로 간단하게 그림을 그리는 코드를 작성하였다.

 

void ObRect::Render()
{
    MoveToEx(g_MemDC, position.x + 100 * cosf(45 * ToRadian + rotation) * scale.x,
        position.y + 100 * sinf(45 * ToRadian + rotation) * scale.y, NULL);

    LineTo(g_MemDC, position.x + 100 * cosf(135 * ToRadian + rotation) * scale.x,
        position.y + 100 * sinf(135 * ToRadian + rotation) * scale.y);

    LineTo(g_MemDC, position.x + 100 * cosf(225 * ToRadian + rotation) * scale.x,
        position.y + 100 * sinf(225 * ToRadian + rotation) * scale.y);

    LineTo(g_MemDC, position.x + 100 * cosf(315 * ToRadian + rotation) * scale.x,
        position.y + 100 * sinf(315 * ToRadian + rotation) * scale.y);

    LineTo(g_MemDC, position.x + 100 * cosf(45 * ToRadian + rotation) * scale.x,
        position.y + 100 * sinf(45 * ToRadian + rotation) * scale.y);
}

ObRect라는 클래스로 객체를 생성하였고 이를 방향키를 누르면 움직이게 만들었다. 이 경우, 실제 화면에서 사각형이 움직일 때, 자연스러운 움직임이 아니라 깜빡깜빡 점멸하는 부자연스러운 움직임을 보인다.

 

이러한 일은 왜 일어나는 것일까?

 

API에서 그림을 띄우고 움직이는 경우 이전에 그렸던 그림을 지우고 다시 움직인다. 이 과정은 동시에 일어나는 것이 아니라 순차적으로 일어난다.

 

그럼 x 좌표를 + 1 시킨 경우 어떤 일이 일어날까?

 

기존에 존재하던 사각형을 지우고, 좌표를 x 방향으로 + 1만큼 움직인 다음 다시 그 자리에서 그림을 그린다. 분명 매우 짧은 순간이지만 우리는 시각적으로 이 간격을 확인할 수 있다.

 

그 결과가 바로 깜빡대며 점멸하듯이 움직이는 것이다.

 

그렇다면 이를 방지하기 위해서는 어떻게 해야 할까?

 

그것을 위한 더블 버퍼링이다.

 

더블 버퍼링이란, 두 장의 그림판(HDC)를 준비하고, 밑에 깔아둔 그림판에 그림을 그리고 그 완성본을 위의 그림판에 복사하는 식으로 깜빡임을 없애는 기법을 말한다.

 

기존에 하나의 그림판에서 두 장의 그림판을 사용하기 때문에 당연히 메모리를 그만큼 더 소모하지만 좀 더 자연스러운 움직임이 가능하다.

 

더블 버퍼링의 원리

실제로 그림을 그리는 것은 밑에 보이지 않는 그림판이고 이 그림을 보이는 그림판에 복사하기 때문에 우리는 빈틈없이 자연스러운 움직임을 보인다고 생각하게 된다.

'프로그래밍 > 공부' 카테고리의 다른 글

[C++] 싱글턴 패턴  (0) 2022.12.13
[C++] 정적(Static) 변수  (0) 2022.12.13
[C++] 비트 연산자  (0) 2022.12.13
[C++] 추상클래스 and 인터페이스  (0) 2022.12.12
[C++] 가상함수 & 순수가상함수  (0) 2022.12.12

댓글