(2022) 공부 (Study)/게임 개발 (Development)

[Win32API] 오브젝트 이동 : 시간 동기화 (1)

수낭 2022. 4. 13. 14:07

모든 컴퓨터는 각각 성능이 다 다르다.
이는 즉, CPU의 연산 처리 속도에 차이가 있다는 뜻으로,
PeekMessage()의 if문에 걸리지 않아서 else() { }로 분기되어서 core->Progress()가 호출되는 속도가
"실행하는 컴퓨터의 성능에 따라서 달라진다"는 뜻이다.

그렇게 되면, 더 좋은 컴퓨터를 가지고 있다는 이유만으로 개발자의 의도와 상관없이
더욱 빠른 속도로 게임을 플레이 해야만 하는 상황이 발생할 수도 있다.

이럴 때에 필요한 것이 시간 동기화이다.
말 그대로, 현실 세계의 시간과 inGame의 프레임을 동기화 시켜서, PC의 성능에 따라서 게임 속도가
결정되도록 두는 것이 아닌, 모두가 현실세계의 일정한 시간의 흐름을 기반으로 게임 플레이가 가능해져서
각기 다른 PC에서도 모두 같은 게임 속도로 플레이가 가능하게 된다.
(inGame의 UI 등장 애니메이션, 등에도 시간 동기화의 개념이 이용된다.)
(모든 유저들에게 똑같은 사용감을 제공하기 위해서)

간단하게 정리하면, 
현실 세계의 1sec를 기준으로, 게임 속 프레임 처리 횟수를 동기화하는 작업으로,
PC의 성능이 비교적 높은 경우, 초당 Object의 이동 거리를 더욱 적게 설정하고,
PC의 성능이 비교적 낮은 경우, 초당 Object의 이동 거리를 더욱 크게 설정하는 방법이 있다.

거리 / 속력 / 시간 상관 관계

void CCore::update()
{
	Vec2 vPos = g_obj.GetPos();

	if (GetAsyncKeyState(VK_LEFT) & 0x8000)
	{
    	vPos.x -= 0.01f * DeltaTime;
	}
}

Frame Per a Secound (FPS)
= (1 / DeltaTime)

Time Per a Frame (DeltaTime)
= (1 / FPS)

vPos.x -= 0.01f * DeltaTime;

 

[Ex1]
100의 거리를 이동하려고 할 때, 100fps의 경우 :
1 frame당 1.0f (distance / FPS)씩 이동하면 됨
distance (100 px) / FPS (100 fps)
= distance (100 px) * DeltaTime (1 / 100 sec)
= 1.0f

[Ex2]
100의 거리를 이동하려고 할 때, 200fps의 경우 :
1 frame당 0.5f (distance / FPS)씩 이동하면 됨
distance (100 px) / FPS (200 fps)
= distance (100 px) * DeltaTime (1 / 200 sec)
= 0.5f

12345

FPS는 매순간 변동이 있기 때문에,
항상 FPS는 어딘가에서 계산이 되어지고 있어야 한다.

다음 포스팅에서는 시간 동기화 기능을 구현하는 것에 대해서 살펴보겠습니다.
https://soonang2.tistory.com/27

 

[Win32API] 오브젝트 이동 : 시간 동기화 (2)

이제 시간 동기화 관련 코드를 구현해보자. 다만 구현하기 전에 새로운 함수에 대해서 살펴보아야 한다. 이전에 우리의 PC에서의 초당 함수 호출 횟수를 확인하는 부분을 설계하여서 그 값을 살

soonang2.tistory.com