이전 시간에 update()와 render() 부분까지 함수를 나눠 core의 process에서 처리하는 코드를 작성했다.
문제는 실제 1 pixel 움직이려고 구현했는데 내부 처리는 매우 많이 되어 이상한 모양이 나왔다.
이를 위해 개선하려 하는데 아이디어는 다음과 같다. 컴퓨터는 내부적으로 연산이 매우 빠르다. 물론 이는 컴퓨터 성능과 연관이 있을 것이다.
그러나 실제로 우리가 1칸 움직이려고 해도 컴퓨터 내부적으로는 아주 작은 1 픽셀 움직이게 된다. 따라서 앞으로 모든 물체의 위치와 크기는 실수로 관리해서 넘겨준다면 결국 내부적으로는 알아서 정수 캐스팅이 되어 가장 작게 1 픽셀씩 움직이게 될 것이다.
이를 위해 Header 폴더에 Struct.h 를 생성해 커스텀한 Vector2를 만들어 주고 사용한다.

x축의 움직임을 1대신 다른 실수로 바꿔도 잘 움직인다. 그러나 여전히 문제점이 있다.
1) 결국 update()함수도 컴퓨터 성능에 따라 좋은 사람은 더 빨리 x축의 움직임이 누적되는건 여전하다.
2) 보이듯 움직인 잔상이 남는다.
따라서 이 두가지를 해결하고자 한다.
먼저 1번을 해결하기 위해 게임속 시간을 실제 시간과 매칭시켜 frame의 개념을 이용해보자.
시작에 앞서 가볍게 수학적인 사고를 해보자. 1초에 10 프레임 도는 컴퓨터가 있다. 그러면 1s / 10frame( = 0.1s/frame) 은 무슨 의미냐? 이 컴퓨터가 한 프레임의 걸리는 시간값이다!
즉! TimerManager에선 이 컴퓨터의 FPS를 알아야 하며 이를 통해 1프레임 당 시간 (deltaTime)을 구해 이 값을 이용한다.
먼저 Window 프로그래밍에는 QueryPerformanceCounter와 QueryPerformanceFrequency가 제공되는데 이전 GetTick()보다 더 정밀한 값을 제공한다.
초기 init에서 이 두 함수를 통해 prevCount와 curFrequency의 값을 저장한다.
그 후 update에서 curCount의 현재 프레임카운팅 값을 저장하고
delta time = prevCount - curCount / curFrequency를 한다. 이때 주의할 점은 둘 다 정수로 나눠봐야 0이니 이를 double로 캐스팅하여 더 정밀한 값으로 바꾼다.

그 후 FPS를 얻기 위해서 deltaTime을 누적하면서 이 값이 1.0이 지났다면 실제 흐른 시간상 1초가 지난 것으로 이 때 까지의 mCallCount가 몇 번 호출됐는지를 가져온다.
이렇게 하여 실행하면 이전과는 다르게 매우 잘 움직인다. 이제 조금 게임 스러운 움직이지만 아직 2번 문제는 해결하지 못했다.
'WinAPI 32' 카테고리의 다른 글
07 WinAPI) Window 창 받아 만들기 (0) | 2023.11.15 |
---|---|
06 WinAPI) Singleton (0) | 2023.11.12 |
05 WinAPI) PeekMessage (0) | 2023.11.11 |
04 WinAPI) 핸들과 DC(2) (0) | 2023.11.10 |
03 WinAPI) 핸들과 DC(1) (0) | 2023.11.09 |