SDL ile delta zamanı nasıl hesaplanır?


11

SDL_GetPerformanceCounter ve SDL_GetPerformanceFrequency adlı iki işlevle delta süresini hesaplayabileceğinizi duydum. Tamamen nasıl çalıştıklarından emin değilim, ancak SDL_GetTicks () kullanmaya biraz benzediğini duydum

    Uint64 NOW, LAST;
    double deltaTime = 0;

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

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

       /**Rendering**/
    }

Bu kod var ama ne zaman ı deltaTime yazdırmak veya kullanmaya çalışın her zaman bazı gerçekten rastgele ve deli sayıları eşittir. Bu doğru mu?


2
gösterilen kod her zaman delta zamanını 0 olarak ayarlar, değil mi? (ŞİMDİ = SON, ŞİMDİ - SON.)
david van brink

Yanıtlar:


13

SDL tarafından SDL_GetPerformanceFrequency üzerinde sağlanan kod örneğini okurken kolayca bu işlevleri kullanarak bir deltatime nasıl hesaplamak bulabilirsiniz.

Temel olarak sizin için buna inmelidir:

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

Not: ilk karenin her zaman 0'lık bir deltansı veya ona çok yakın bir şey olacaktır.

Bu, deltaTime değerini milisaniye cinsinden doldurmalıdır; bu, nihai sonucu 0.001 ile çarparak saniyeye kolayca dönüştürülebilir.

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


6
Bu daha doğru olur: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );çünkü bu, tamsayı bölümü nedeniyle sayıyı sıkıştırmaktan kaçınır.
Mortennobel

2

Delta zamanını hesaplamak için gittiğim yol şuydu 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;
    }
};

Sonra sadece Clockana döngüde bir örneği işaretliyorum .


Bu yaklaşım da işe yarıyor olsa da, diğer cevap daha kesindir.
Tyyppi_77
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.