SDL_GetTicks () exactitude inférieure au niveau de la milliseconde

Je programme actuellement quelque chose avec SDL2. Tout fonctionne bien, mais j’ai un problème avec la méthode SDL_GetTicks() . Normalement, le temps d’application total doit être renvoyé en millisecondes, mais la plupart du temps, il renvoie la valeur 0 et parfois la valeur 1.

J’ai initialisé SDL avec l’indicateur SDL_INIT_EVERYTHING .

Le problème avec le code suivant est que la boucle est trop rapide, donc le temps delta est inférieur à 1 ms. Existe-t-il une méthode pour atteindre une plus grande précision?

 #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(); } 

Vous ne pouvez pas utiliser SDL_GetTicks () si vous voulez une précision supérieure, mais il existe de nombreuses autres alternatives. Si vous voulez être indépendant de la plate-forme, vous devez être prudent, mais voici un exemple portable C ++ 11 qui vous aidera à démarrer:

 #include  #include  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(t2 - t1).count() << " nanoseconds" << std::endl; } 

Courir ceci sur ideone.com m'a donné:

 Delta t2-t1: 282 nanoseconds 

Bien sûr, vous devez réellement attendre jusqu’à> = 1 ms avant de mettre à jour votre dernier compte de ticks

 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; } }