델타 시간을 얻는 방법


14

게임에서 마우스를보고 걷는데 매우 느리고 사용하기가 어렵습니다. 고정 속도를 사용하고 있기 때문이라고 생각합니다. 큰 프로젝트에서 개발자는 델타 시간을 사용한다고 들었습니다. glut의 델타 시간은 어떻게 계산합니까? 델타 시간을 사용하여 속도를 어떻게 계산합니까?


답변:


18

"델타 시간"은 두 프레임 업데이트 사이에 경과 된 시간 이었지만 다른 상황에서도 사용할 수 있습니다 (일반적으로 시간 빼기의 결과 임).

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에서 고정 시간 단계와 가변 시간 단계 를 읽어야 합니다.


밀리 초를 정수로 반환합니까? 거칠고 충분하지 않을 수 있습니다. 나는 항상 플랫폼 고유의 타이머를 사용해야했으며 게임에 적합하지 않기 때문에 전염병처럼 GLUT를 피했습니다.
Sean Middleditch

@Sean 저는 GLUT도 사용하지 않지만 질문의 매개 변수에 있었으므로 이것을 염두에두고 대답했습니다.) 그러나 게임에서 밀리 초를 처리 할 수있는 int의 "부족"에 관한 당신의 입장에 흥미가 있습니다. . A는 positive int4.294.967.295에 가입하고있는 경우 일반적으로 서명되지 않은 경우 ... 우리는 작은 하나가 2.147.483.647 밀리 거의 이십오일 고려해야 그렇게해도 ... 대부분의 게임을 처리 할 수 매우 충분해야 2.147.483.647까지 이동 타이머가 충분하지 않더라도 우리는 여전히 합리적으로 unsigned int(~ 50 일) 또는 심지어 long long(평소대로 ) 사용할 수 있습니다 .
Valkea

1
@Valkea 포인트가 최대 값이 아니며 최저값의 해상도입니다. 60 FPS의 단일 프레임은 16 2 / 3rds ms이므로 1ms의 정확도 (밀리 초를 정수로 나타냄)는 5 % 이상의 오류 마진을 나타냅니다. 마이크로 초의 정수 카운트는 견딜 수 있지만 밀리 초는 너무 거칠다.
Steven Stadnicki

예, 많은 것을 위해 1 밀리 초 미만의 타이밍과 GLUT이 제공하지 않는 고해상도 타이머가 필요합니다 (내가 아는 것). QueryPerformanceCounterWindows 및 gettimeofday대부분의 다른 플랫폼에서 사용할 작은 플랫폼 코드를 작성하는 것은 나쁘지 않습니다 . 손을 더럽 히고 플랫폼 API의 최소 공통 분모, 특히 C 및 C ++보다 조금 더 많이 목표로 삼아야합니다.
Sean Middleditch

이러한 정밀도는 모든 게임에 유용한 것은 아닙니다. 그러나 이것은 int와 clock에 관한 당신의 관점에 대한 나의 심문에 완전히 대답하는 매우 흥미로운 설명입니다. 나는 아직 고정밀 시계가 필요하지 않았지만 문제에 대한 내 지식을 심화시킬 때가 된 것 같습니다. 감사합니다;)
Valkea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.