2014-10-18 161 views
3

我現在用SDL2編寫了一些程序。 所有工作正常,但我有一個SDL_GetTicks()方法的問題。 通常它應該返回以毫秒爲單位的總應用時間,但它總是返回大部分時間的值0,有時候爲1.SDL_GetTicks()精度低於毫秒級

我使用SDL_INIT_EVERYTHING標誌初始化SDL。

以下代碼的問題是循環太快,所以增量時間小於1毫秒。有沒有一種方法可以達到更高的精度?

#include "Application.hpp" 

void Application::Initialize() 
{ 
    int sdl_initialize_result = SDL_Init(SDL_INIT_EVERYTHING); 
    if(sdl_initialize_result < 0) 
    { 
     std::cerr << "Failed to initialize SDL !" << std::endl << SDL_GetError() << std::endl; 
    } 

    window = SDL_CreateWindow("Project Unknown", 100, 100, 800, 600, SDL_WINDOW_SHOWN); 
    if(window == nullptr) 
    { 
     std::cerr << "Failed to create SDL window !" << std::endl << SDL_GetError() << std::endl; 
    } 

    last_update_time = SDL_GetTicks(); 
} 

void Application::Dispose() 
{ 
    SDL_DestroyWindow(window); 
    SDL_Quit(); 
} 

void Application::Render() 
{ 
} 

void Application::Update() 
{ 
    Uint32 current_time = SDL_GetTicks(); 
    Uint32 delta_time = current_time - last_update_time; 


    SDL_Event event; 
    while(SDL_PollEvent(&event)) 
    { 
     switch(event.type) 
     { 
      case SDL_QUIT: 
      { 
       should_close = true; 
      } 
      break; 

      default: 
      { 

      } 
      break; 
     } 
    } 

    // Update game objects with delta_time 

    last_update_time = current_time; 
} 


void Application::Run() 
{ 
    Initialize(); 

    should_close = false; 
    do 
    { 
     Render(); 
     Update(); 
    } 
    while(should_close == false); 

    Dispose(); 
} 
+1

一些代碼可以幫助我們解決問題。 – benbot 2014-10-18 14:40:01

+0

好的,我添加了它。 – user3325226 2014-10-18 15:18:03

+0

和,它使用它導致你的問題?什麼類型是last_update_time? – 2014-10-18 15:50:06

回答

5

如果想要更高的精度但不能使用SDL_GetTicks(),但還有很多其他的選擇。如果你想成爲平臺獨立的,你必須要小心,雖然,但這裏是一個便攜式C++ 11的例子,讓你開始:

#include <iostream> 
#include <chrono> 
typedef std::chrono::high_resolution_clock Clock; 

int main() 
{ 
    auto t1 = Clock::now(); 
    auto t2 = Clock::now(); 
    std::cout << "Delta t2-t1: " 
       << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count() 
       << " nanoseconds" << std::endl; 
} 

上ideone.com運行此遞給我:

Delta t2-t1: 282 nanoseconds 
+0

完全依賴於編譯器和操作系統。例如,在GCC,Windows或MSVC 2013下無法工作。 – metamorphosis 2016-02-20 23:05:56

+1

這不是操作系統的依賴,但是你需要一個編譯器能夠編譯C++ 11,我猜你沒有。 – Martin 2016-02-21 07:16:02

+0

它實際上取決於操作系統,因爲不同的操作系統有不同的內部計數器,有些比其他的更好。 Windows上的主要編譯器在這一點上都沒有能夠實際納秒時序的正常運行的計時器。 – metamorphosis 2016-02-22 03:43:54

0

嘛,當然,你需要真正等到> = 1毫秒更新前已經通過你的最後一跳算

void Application::Update() 
{ 
    Uint32 current_time = SDL_GetTicks(); 
    Uint32 delta_time = current_time - last_update_time; 

    SDL_Event event; 
    while(SDL_PollEvent(&event)) 
    { 
     switch(event.type) 
     { 
      case SDL_QUIT: 
      { 
       should_close = true; 
      } 
      break; 

      default: 
       break; 
     } 
    } 

    if (delta_time >= 1) 
    { 
     // Update game objects with delta_time 

     last_update_time = current_time; 
    } 
}