WinAPI 12 Double Buffering

CJB_ny·2022년 8월 31일
0

WinAPI

목록 보기
12/79
post-thumbnail

render함수 개선 ㄱㄱ.

물체가 많아지고 그러다 보면은

우리가 싹다

이렇게 100만개 넘는 픽셀을 다지우고 사각형 그리고 이 짓을 초당 2만번 수행하는 중이다.

이러면 어느 시점에는 사각형이 보였다가 안보였다가 하는 깜빡이는 현상이 발생한다.

그리는 순가간을 봤을 수도 있고 계속 지우는 장면만 본다면 사각형이 없다고 생각할 것이다.


그래서 이것을 해결하는 방법이

다른 그림판을 미리 준비를 하고 이 그림판에서 그림을 다 그리고 나서 보여줄 그림판에
한번만 그리는 것이다.

=> 그리는 과정이 사용자에게는 보이지 않는다.

이 Rectangle을 하고 있는 중에는 보이지 않는다.

이 렌더링 하나가 '완벽하게' 이루어지기 전까지는 싱크가 안 맞게 된다.

그래서 진짜로 컴퓨터(윈도우)가 픽셀 하나하나 체우는것 까지는 안보여주고

Rectangle이 끝나면 한방에 보여줌.

그래서 오른쪽에서 이동하면은 싹다 다시 그리고 보여줄 그림판에 변경점을 한방에 그리면 된다.

이런거 구현하는게

Double Buffer

buffer를 두개를 두고 렌더링을 양쪽으로 관리를 하는 것이다.



이런식으로 일단 순서대로 채워준다.

그 다음


이부분이 뭔지 설명한다.

먼저 init에서 우리가 원하는 해상도 만큼 윈도우가 나올 수 있게 SetWindowPos로 조정했다.

그러면 윈도우는 해당 작업영역에 대해서 '픽셀'을 보유하게되는데

이 픽셀 데이터들을 다 묶어서 '비트맵'이라고 한다.

이렇게 비트맵을 가진다.

그래서 지금 윈도우가 하나 더 필요한게 아니라 이 비트맵 데이터를 (똑같은 해상도의)을 하나 더 가지고 싶은 상황이다. 이 비트맵에 그려서 윈도우에 복사시키면 됨.

윈도우를 가르키고있는 DC와 비트맵 데이터를 가리키는 DC의 호환성을 생각해서

CreateCompatibleDC를 사용한 것이다.

또한, DC가 만들어지면은 내부적으로 갖출것은 갖추어야 하기 때문에

DC가 만들어질때의 목적지에 1픽셀짜리의 목적지가 생성이 된다.

그냥 의미없이 만들어진 기본값이라고 보면은 된다.

그래서 그 1픽셀 바로 지움.

메인 DC와는 다르게 Delete하는데 이것은 그냥 이유를 모른다(이렇게 하레 MS에서)

그래서

이렇게 새로 설정해준 DC에다가 그런다. 그러면 우리 윈도우에서는 사각형이 안보인다.

오른쪽에다가 그리는 상황이다.

그러면 이제 그림이 완성되면 왼쪽에다가 복사 시켜 주어야한다.

그래서 서로다른 DC끼리

왼쪽에서 오른쪽으로 복사시키는 과정이다. 픿셀을 한땀한땀씩.

그럴때 사용하는 함수가 'BitBlt'함수이다.

목적지, 복사받을 부위

원본 DC의 좌상단 0, 0 부터 -> 전체 해상도.

카피한다. => 잘된다.

근데 프레임 엄청나게 떨어진다. 사실 이과정도 속도가 엄청나게 느린 것이다.

이 모든것을 'CPU'를 통해서 처리를 하는 중이다.

물체를 그리는 이 과정들이 어마어마한 반복처리이다.

'일 자체는 단순한데' 반복이 엄청 많다. => GPU

CPU는 똑똑한 애다. GPU는 초딩 1000명.

엄청난 반복적인 렌더링 처리를 하기 위해서 등장한게 GPU이다.

근데 winAPI렌더링 관련 함수는 CPU를 통해서 한다.

근데 지금 이상태에서 Rewctangle함수 더 호출해서 그림 더그려도 프레임이 막 더 떨어지지는 않는다.

BitBlt는 고정 비용을 요구해서 그림 더 그려도 프레임 안 떨어진다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글