Bagaimana cara menghitung waktu delta dengan SDL?

11

Saya telah mendengar bahwa Anda dapat menghitung waktu delta dengan dua fungsi yang disebut SDL_GetPerformanceCounter dan SDL_GetPerformanceFrequency. Saya tidak yakin bagaimana mereka bekerja sepenuhnya, tapi saya dengar ini sedikit mirip dengan menggunakan 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**/
    }

Saya memiliki kode ini tetapi setiap kali saya mencetak deltaTime atau mencoba menggunakannya selalu sama dengan beberapa angka yang benar-benar acak dan gila. Apakah ini benar?

surafel911
sumber
2
kode yang ditampilkan akan selalu mengatur waktu delta ke 0, kan? (SEKARANG = TERAKHIR, SEKARANG - TERAKHIR.)
david van

Jawaban:

13

Ketika membaca kode-contoh yang disediakan oleh SDL pada SDL_GetPerformanceFrequency saya dapat dengan mudah mengetahui bagaimana Anda bisa menghitung deltatime menggunakan fungsi-fungsi ini.

Ini pada dasarnya harus turun untuk ini untuk Anda:

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

Catatan: frame pertama akan selalu memiliki deltatime 0 atau sesuatu yang sangat dekat dengannya

Ini harus mengisi nilai deltaTime dalam milidetik, ini dapat dengan mudah dikonversi menjadi detik dengan mengalikan hasil akhir dengan 0,001.

Referensi: https://wiki.libsdl.org/SDL_GetPerformanceFrequency

Patrick le Duc
sumber
6
Ini akan lebih akurat: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );karena ini menghindari penjepitan nomor karena pembagian bilangan bulat.
Mortennobel
2

Mereka cara saya sudah pergi tentang menghitung waktu delta telah melalui 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;
    }
};

Maka saya cukup mencentang sebuah Clockinstance di loop utama.

Salajouni
sumber
Sementara pendekatan ini juga berhasil, jawaban lainnya lebih tepat.
Tyyppi_77