SDLでデルタ時間を計算する方法は?


11

SDL_GetPerformanceCounterとSDL_GetPerformanceFrequencyと呼ばれる2つの関数でデルタ時間を計算できると聞きました。完全にどのように機能するかはわかりませんが、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 2015年

回答:


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**/
}

注:最初のフレームのdeltatimeは常に0またはそれに非常に近いものになります

これは値deltaTimeをミリ秒単位で埋める必要があります。これは、最終結果に0.001を乗算することで簡単に秒に変換できます。

リファレンス:https : //wiki.libsdl.org/SDL_GetPerformanceFrequency


6
これはより正確になります。deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );これにより、整数の除算による数値のクランプが回避されます。
Mortennobel 2016

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 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.