Làm thế nào để tính thời gian delta với SDL?


11

Tôi đã nghe nói rằng bạn có thể tính toán thời gian delta với hai hàm được gọi là SDL_GetPerformanceCorer và SDL_GetPerformanceFrequency. Tôi không chắc làm thế nào chúng hoạt động hoàn toàn, nhưng tôi nghe nói nó hơi giống với việc sử dụng 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**/
    }

Tôi có mã này nhưng bất cứ khi nào tôi in deltaTime hoặc cố gắng sử dụng nó, nó luôn bằng một số số thực sự ngẫu nhiên và điên rồ. Điều này có đúng không?


2
mã hiển thị sẽ luôn đặt thời gian delta thành 0, phải không? (NOW = LAST, NOW - LAST.)
david van brink

Câu trả lời:


13

Khi đọc ví dụ mã được cung cấp bởi SDL trên SDL_GetPerformanceFrequency, tôi có thể dễ dàng tìm ra cách bạn có thể tính toán thời gian sử dụng các hàm này.

Về cơ bản, nó sẽ giúp bạn điều này:

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

Lưu ý: khung đầu tiên sẽ luôn có độ trễ bằng 0 hoặc một cái gì đó rất gần với nó

Điều này sẽ điền vào giá trị deltaTime tính bằng mili giây, điều này có thể dễ dàng được chuyển đổi thành giây bằng cách nhân kết quả cuối cùng với 0,001.

Tham khảo: https://wiki.libsdl.org/SDL_GetPerformanceFrequency


6
Điều này sẽ chính xác hơn: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );vì điều này tránh kẹp số do phân chia số nguyên.
Mortennobel

2

Theo cách chúng tôi đã tính về thời gian delta đã qua 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;
    }
};

Sau đó, tôi chỉ cần đánh dấu vào một Clock ví dụ trong vòng lặp chính.


Trong khi phương pháp này cũng hoạt động, câu trả lời khác chính xác hơn.
Tyyppi_77
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.