WinAPI 11 Timer(2)

CJB_ny·2022년 8월 29일
0

WinAPI

목록 보기
11/79
post-thumbnail

매번 update할 때마다 한 프레임에 걸린 시간을 구할 것이다.

ctimeManger에서

매번 update돌때마다 '한 프레임에 걸린 시간' 구할 것이다.

'한 프레임 호출되는데 걸리는 시간'

이 update가 매번 들어오기 때문에

현재 카운트 값을 다시 계산을 하고

QuardPart부분이 __int64 == long long 자료형

저장된 값끼리 빼보면

이전에 세어놓았던 지금 세었던거 차이를 알 수 있다.

이전 카운트 값을 현재로 갱신 시켜놓고

다음번 update 호출 될 때 다시 되돌아 오면은

'현재 카운트'와 '이전 카운트' 차이가 '한프레임 차이'에서의 '카운트 차이 값'이 나오지 않을까?

=> 이렇게 얻어진 카운트 차이값을 가지고 뭘 구하고 싶냐면은

'한 프레임에 걸린 시간값'을 구하고싶다.

frequency는 '초당 카운트 값'이다. == 1초에 나는 이만큼 셀수 있어.

frequency로 둘의 차이값을 나누어 주어야한다.

근데 이만큼 차이가 났을 때, 내가 1초동안 셀 수 있는 카운트 대비 어느정도 인지를 나누어서 확인해보면 이때 걸린 시간을 알 수 있다.

내가 1초에 100을 셀 수 있다. 근데 카운트 차이가 1이 났어
-> 그럼 1/100초가 지났다.

내가 1초에 100을 셀수가 있는데 카운트 차이가 50이 났다. -> 그럼
0.5초가 지났다! 라는 말 아니가?

현재 이값이 정수라서 나누면 무조건 0 나와서 실수로 바꾸자.

현재 deltaTime을 역수치화 하면 초당 프레임이 나오는데

deltaTime은 프레임사이의 시간 간격이다.

이게들쭉 날쭉 하다. 또한 너무 미세한 시간이다.

그래서 이것보다는 CTimeManager의 update함수가 몇번 호출됬는지를 보는게 더 정확할 수 있다.

update함수는 매프레임마다 호출되니까.

그래서 1초동안 몇번이 호출 되었는지 알기위한 _callCount값을 증가시키고

이 값이 1초가 되었을때 몇번 호출했는지 보기 위한 if문이 있다.

이 if문에는 '1초가 되었을 경우라는 조건'이 들어가야하는데

_acc += _deltaTime을 해서 구해야한다.

프레임과 프레임사이의 미세한 시간값을 _acc에 계속 더한다는 말은 무엇인가?
=> 그냥 흘러간 시간이 체크가 된다.

이게 1이라면 1초이다. _deltaTime은 소수이니까. 그리고 다음번의 시간을 체크 하기 위해서

0으로 다시 돌려준다.

그래서 함수 호출 횟수를 fps라 정하고 이것을 윈도우에 띄어 보도록 하자.

평균적으로 fps는 3만7천 프레임. 이게 초당 프레임 횟수이고

DT가 프레임간의 시간간격이 0.000053초이라는 말이다.

지금은 뭔 일을 안하고 있어서 프레임이 높은데 작업이 하나만 늘어나도 프레임이 반타작난다.

근데 이런 일이 계속 쌓이다 보면은

어느 순간에는 프레임이 하는 일이 너무 많아서 앵간해서는 프레임이 잘 떨어지지 않는다.

그래서 이제는

이런 고정값으로 이동안할 것이다.

이렇게해주면 1초에 100픽셀 움직인다.

그러면 이제 프로그램이 빨리돌고 느리게 돌고에 상관없이

안정적인 _deltaTime값으로 각 프레임에서 할일 만큼만 하는 것이다.

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

0개의 댓글