게임에서 마우스를보고 걷는데 매우 느리고 사용하기가 어렵습니다. 고정 속도를 사용하고 있기 때문이라고 생각합니다. 큰 프로젝트에서 개발자는 델타 시간을 사용한다고 들었습니다. glut의 델타 시간은 어떻게 계산합니까? 델타 시간을 사용하여 속도를 어떻게 계산합니까?
게임에서 마우스를보고 걷는데 매우 느리고 사용하기가 어렵습니다. 고정 속도를 사용하고 있기 때문이라고 생각합니다. 큰 프로젝트에서 개발자는 델타 시간을 사용한다고 들었습니다. glut의 델타 시간은 어떻게 계산합니까? 델타 시간을 사용하여 속도를 어떻게 계산합니까?
답변:
"델타 시간"은 두 프레임 업데이트 사이에 경과 된 시간 이었지만 다른 상황에서도 사용할 수 있습니다 (일반적으로 시간 빼기의 결과 임).
glutGet 메소드 및 GLUT_ELAPSED_TIME 매개 변수와 일부 연산을 사용하여 glut의 델타 시간을 얻을 수 있습니다 .
다음 행은 glutInit가 호출 된 이후 (또는 glutGet (GLUT_ELAPSED_TIME)에 대한 첫 번째 호출) 밀리 초 수를 반환합니다.
int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
따라서 각 렌더링 루프에서 현재 timeSinceStart를 등록하면 이전 것을 빼고 deltaTime을 알 수 있습니다.
int oldTimeSinceStart = 0;
while( ... )
{
int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
int deltaTime = timeSinceStart - oldTimeSinceStart;
oldTimeSinceStart = timeSinceStart;
//... stuff to update using deltaTime
}
clock () 및 클럭 틱과 초 간의 관계를 지정하는 매크로 상수 표현식 CLOCKS_PER_SEC 와 함께 C / C ++ ctime 라이브러리 를 사용하여 거의 같은 방식으로 수행 할 수도 있습니다 .
기본적으로 deltaTime을 사용하여 고정 시간 값을 사용하는 대신이 경과 시간에 비례하여 움직임을 업데이트 할 수 있습니다. 이런 식으로 프로그램이 60fps로 실행되거나 10fps로 실행되는 경우 캐릭터의 이동 속도는 거의 동일해야합니다.
다음은 작은 예입니다. x 축에서 초당 10 단위 씩 무언가를 이동한다고 가정합니다. deltaTime이 실제로 밀리 초를 사용하는 경우 이와 같은 작업을 수행 할 수 있습니다.
Position.x += 10/1000 * deltaTime;
이렇게하면 프로그램이 2 번 또는 100 번 업데이트되었는지, 1 초 후에 위치가 거의 같아야하며, 게임 플레이는 고정 된 값을 사용하는 경우보다 작은 컴퓨터의 낮은 fps에 의해 영향을 덜받습니다.
고정 값 ==> 낮은 fps = 적은 업데이트 = 느린 움직임 반면 높은 fps = 높은 업데이트 = 매우 빠른 움직임.
deltaTime ==> "거의"같은 움직임으로.
마지막으로 gamedev.stackexchange에서 고정 시간 단계와 가변 시간 단계 를 읽어야 합니다.
positive int
4.294.967.295에 가입하고있는 경우 일반적으로 서명되지 않은 경우 ... 우리는 작은 하나가 2.147.483.647 밀리 거의 이십오일 고려해야 그렇게해도 ... 대부분의 게임을 처리 할 수 매우 충분해야 2.147.483.647까지 이동 타이머가 충분하지 않더라도 우리는 여전히 합리적으로 unsigned int
(~ 50 일) 또는 심지어 long long
(평소대로 ) 사용할 수 있습니다 .
QueryPerformanceCounter
Windows 및 gettimeofday
대부분의 다른 플랫폼에서 사용할 작은 플랫폼 코드를 작성하는 것은 나쁘지 않습니다 . 손을 더럽 히고 플랫폼 API의 최소 공통 분모, 특히 C 및 C ++보다 조금 더 많이 목표로 삼아야합니다.