Search
Duplicate

LV07 Time, Double Buffering

숙제

Plyaer가 Space키를 누르면 총알이 앞으로 나가도록 구현해보세요.

Time

게임을 실행하는데 있어서 큰 문제점이 있습니다.
그건 바로 게임을  실행하는 컴퓨터에 사양에 따라서 프로그램 실행 속도가 다르다는 점입니다.
사양이 좋은 컴퓨터라면 동일한 시간동안 해당 로직을 100번 반복하여 100미터 만큼 이동할것이고
사양이 좋지 않은 컴퓨터라면 동일한 시간동안 10미터 만큼밖에 이동하지 못할것 입니다.
그래서 우리는 컴퓨터 사양과 관계없이 동일하게 실행될수 있도록 해주어야 합니다.
30프레임 게임은 100 * 0.02 = 2 => 2 * 30 = 60
60프레임 게임은 100 * 0.01 = 1 => 1 * 60 = 60
이런식으로 차등 값을 곱해주어 결과값을 마추려고 합니다.
저기서 0.02, 0.01은 1프레임당 걸리는 시간 (DeletaTime) 이라고 합니다.
Delta Time
Deleta Time을 구하기 위해서는 2가지 윈도우 함수를 이용해야 합니다.
QueryPerformanceFrequency 함수는 초당 CPU의 고유 진동수를 가져옵니다.
다만 Window10부터는 고유 진동수가 아닌 10,000,000이라는 숫자를 고정적으로 가져옵니다.
QueryPerformanceCount 함수는 프로그램이 실행하는 동안 얼마만큼의 진동수가 지나갔는지를 측정해줍니다.
프로그램이 끝났을때 걸린 진동수에서 프로그램이 처음에 시작했을때 걸린 진동수를 뺴준후 우리 CPU의 고유진동수로 나누어주면 됩니다.

더블 버퍼링

우리 프레임워크에는 문제점이 하나 있다.
우리가 비트맵  배경 이미지  그림을 그리는 작업은 그림을 읽는 작업에 비해 훨씬 느리다는
단점이 있다.
또한 실시간으로 지워주고 다시 그리고 지워주고 다시 그리고를 반복하다 보면 깜빡거림 현상이 일어나게 된다.
이러한 Flicking 현상을 해결하기 위해 더블 버퍼링을 사용한다.
새로운 HDC와 배경인 BITMAP 을 만들어준다.
만들기에 앞서 실제 윈도우 크기와 실제작업영역이 다르다.
우리가 생성한 윈도우 영역은 브라우저 상단영역 및 그외 좌우 바등 윈도우 전체영역을 기준으로 크기를 정하여 윈도우창을 만들어 주었다.
AdjustWindowRect함수를 이용하면 실제 작업영역의 크기를 지정해줄수 있다.
이제 backBuffer에 물체를 그려준후 원래 buffer에 복사해서 한번에 그릴수 있게 되었다.
더블 버퍼링을 적용시켜 보자.