วิธีคำนวณเวลาเดลต้าด้วย 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 ใช่ไหม (ตอนนี้ = LAST, ตอนนี้ - LAST.)
david van brink

คำตอบ:


13

เมื่ออ่านตัวอย่างโค้ดที่จัดทำโดย SDL ใน SDL_GetPerformanceFrequency ฉันสามารถค้นหาวิธีคำนวณการหน่วงเวลาโดยใช้ฟังก์ชันเหล่านี้ได้อย่างง่ายดาย

โดยพื้นฐานแล้วสิ่งนี้ควรลงมาเพื่อคุณ:

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.