컴퓨터 | A | B |
초당 함수 실행 횟수 | 5번 | 1번 |
위의 A 컴퓨터와 B 컴퓨터가 있을때 이동함수 1회에 100을 이동한다고 가정하면
A컴퓨터에서는 1초에 500을 이동하고 B컴퓨터에서는 1초에 100을 이동한다.
같은 게임에서 이렇게 되면 공평하지도 않고 말도 되지 않는다.
해결방법으로는 A컴퓨터에서 500을 5로 나누거나 500에 0.2를 곱해주면 된다.
그치만 5를 구해서 나누는 방법은 컴퓨터의 성능,실행 환경에 따라 달라지기 때문에
사실상 불가능에 가깝다.
0.2의 숫자를 구하는 방법은 있다.
컴퓨터는 언제나 숫자를 세고 있는데 이는 성능과 전혀 상관없이 CPU에 달려있는
다른 장치에서 해주는 것이기 때문에 언제나 정확하다.컴퓨터가 켜지거나 혹은
어떤 프로그램이 실행되면 숫자를 계속 세고있다.
즉, 1초에 언제나 정확하게 같은 양의 숫자를 세고있다.
컴퓨터가 이 숫자를 무조건 1초에 50을 센다고 가정을 하고
프로그램이 컴퓨터가 켜짐과 동시에 실행된다고 가정하면
초 | 컴퓨터 A (1초에 5번) | 컴퓨터 B (1초에 1번) | |
0.2 | 컴퓨터가 세는 숫자 : 10 | ||
0.4 | 컴퓨터가 세는 숫자 : 20 | ||
0.6 | 컴퓨터가 세는 숫자 : 30 | ||
0.8 | 컴퓨터가 세는 숫자 : 40 | ||
1.0 | 컴퓨터가 세는 숫자 : 50 | 컴퓨터가 세는 숫자 :50 |
이런식으로 된다고 가정하면 여기서 알고있는 숫자는 50이다.
여기서 컴퓨터가 1초에 세는 숫자를 Count라 하고
함수가 실행될때의 컴퓨터가 세는 숫자를 CurTime이라 하고
PrevTime = 0 을 해주면
처음에는 Count = 50 , CurTime = 0 , PrevTime = 0 에서
A컴퓨터에서 첫 함수가 실행되면 CurTime = 10 이 되고 PrevTime = 0 이 된다.
여기서 (CurTime - PrevTime) / Count 를 해주면 0.2가 나온다.
그리고 PrevTime = CurTime 을 해주면
두번째 함수 실행에서는 CurTime = 20 이 되고 PrevTime = 10 이 된다.
여기서 위와 똑같은 공식을 사용하면 0.2가 나오고
계속 반복해도 결과는 0.2가 나온다.
이렇게 하면 A컴퓨터는 1초에 100을 이동하지만 5번을 나눠서
이동하기 때문에 부드럽게 이동하는것처럼 보이지만
B 컴퓨터에서는 1초에 100을 한번에 이동하기 때문에
뚝뚝 끊키면서 이동하듯이 보이게되고 이를 흔히 우리가 아는 렉이 걸린다는 현상이다.
여기서 함수가 한번 실행되는 것을 프레임이라고 한다.
즉 위의 가정에서 보면 A 컴퓨터는 5프레임이고 B 컴퓨터는 1프레임 인것이다.
QueryPerformanceFrequency 함수는 위에서 설명한 컴퓨터가 세는 숫자를
1초에 얼마를 셌는지를 알려주는 함수이다.
QueryPerformanceCounter 함수는 컴퓨터가 지금까지 얼만큼의 숫자를 셌는지를 알려준다.
컴퓨터는 컴퓨터가 켜지면은 CPU에 달려있는 다른 장치로부터
숫자를 세기 시작 하는데 그렇기 때문에 각 컴퓨터들은 성능에 상관없이
1초에 같은 양의 숫자를 세고있다.
예를 들어서 컴퓨터가 세는 숫자가 1초마다 10을 센다고 하고
10을 셀떼마다 케릭터가 10만큼 이동한다고 해주면은 모든 컴퓨터에서 같은 이동량을 가질것이고
컴퓨터가 1을 셀때마다 함수를 1번 실행할 수 있는 컴퓨터라면 1초에 10프레임으로
10만큼 이동한다는 의미이다.
'WinAPI' 카테고리의 다른 글
키 입력, template 가변인자 (0) | 2021.01.30 |
---|---|
union 문법 (0) | 2021.01.29 |
포인터형 싱글톤 (0) | 2021.01.26 |
파일 경로 관리(문자열 파싱) (0) | 2021.01.23 |
TransparentBlt 함수 , #pragma comment (0) | 2021.01.22 |