SDL로 델타 시간을 계산하는 방법은 무엇입니까?


11

SDL_GetPerformanceCounter와 SDL_GetPerformanceFrequency라는 두 함수로 델타 시간을 계산할 수 있다고 들었습니다. 어떻게 작동하는지 잘 모르겠지만 SDL_GetTicks ()를 사용하는 것과 약간 비슷하다고 들었습니다.

    Uint64 NOW, LAST;
    double deltaTime = 0;

    while (somebool)
    {
       LAST = SDL_GetPerformanceCounter();
       NOW = SDL_GetPerformanceCounter();
       LAST = NOW;

       deltaTime = (NOW - LAST) / (double)SDL_GetPerformanceFrequency();

       /**Rendering**/
    }

나는이 코드를 가지고 있지만 deltaTime을 출력하거나 사용하려고 할 때마다 항상 임의의 미친 숫자와 같습니다. 이 올바른지?


2
표시된 코드는 항상 델타 시간을 0으로 설정합니다. (NOW = LAST, NOW-LAST.)
david van brink

답변:


13

SDL_GetPerformanceFrequency에서 SDL이 제공하는 코드 예제를 읽을 때 이러한 함수를 사용하여 델타 타임을 계산하는 방법을 쉽게 찾을 수 있습니다.

기본적으로이 문제를 해결해야합니다.

Uint64 NOW = SDL_GetPerformanceCounter();
Uint64 LAST = 0;
double deltaTime = 0;

while (somebool)
{
   LAST = NOW;
   NOW = SDL_GetPerformanceCounter();

   deltaTime = (double)((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );

   /**Rendering**/
}

참고 : 첫 번째 프레임의 델타 타임은 항상 0이거나 그와 매우 가까운 것입니다.

이것은 deltaTime 값을 밀리 초 단위로 채워야하며, 최종 결과에 0.001을 곱하여 쉽게 초로 변환 할 수 있습니다.

참조 : https://wiki.libsdl.org/SDL_GetPerformanceFrequency


6
이것은 더 정확합니다 : deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );정수 나누기로 인한 숫자 클램핑을 피하십시오.
Mortennobel

2

델타 시간을 계산 한 방법은 다음과 SDL_GetTicks()같습니다.

struct Clock
{
    uint32_t last_tick_time = 0;
    uint32_t delta = 0;

    void tick()
    {
        uint32_t tick_time = SDL_GetTicks();
        delta = tick_time - last_tick_time;
        last_tick_time = tick_time;
    }
};

그런 다음 Clock메인 루프에서 인스턴스를 선택합니다.


이 방법도 효과가 있지만 다른 대답은 더 정확합니다.
Tyyppi_77
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.