Je rencontre un problème intéressant, mais étrange, avec mon chronomètre. Il semble que les millisecondes fonctionnent très bien. Cependant, lorsque j’essaie d’appliquer la dissortingbution std::chrono::seconds
, j’obtiens soudainement 0.000000
lors de la conversion en float.
Ma timer est la suivante:
#include #include #include class Timer { public: typedef std::chrono::high_resolution_clock Time; typedef std::chrono::milliseconds ms; //<--If changed to seconds, I get 0.00000 typedef std::chrono::duration fsec; std::chrono::high_resolution_clock::time_point m_timestamp; float currentElapsed; Timer() { m_timestamp = Time::now(); } float getTimeElapsed() { return currentElapsed; } void Tick() { currentElapsed = std::chrono::duration_cast(Time::now() - m_timestamp).count(); m_timestamp = Time::now(); } public: //Singleton stuff static Timer* Instance(); static void Create(); };
La timer est cochée une fois par image. Ainsi, par exemple, je reçois normalement environ 33 ms par image. 33ms / 1000 = 0.033s
seconde, il devrait donc y avoir beaucoup d’espace de bits pour tenir cela.
Des idées sur ce qui se passe peut-être?
Toute aide est grandement appréciée!
EDIT: Désolé, secondes, pas millisecondes
std::chrono::seconds
et al. sont tous spécifiés pour avoir des représentations intégrales (C ++ 11 §20.11.2 [time.syn]). Lorsque vous convertissez une durée haute résolution en une durée basse résolution, vous effectuez une division entière avec troncature, par exemple:
using namespace std::chrono; assert(duration_cast(milliseconds{999}) == seconds{0});
Vous pouvez éviter cette troncature en basculant sur une représentation en virgule flottante avant la mise à l’échelle plutôt qu’après :
using namespace std::chrono; currentElapsed = duration_cast>(Time::now() - m_timestamp).count();
( Démo au coliru )
Mieux encore, stockez currentElapsed
comme duration
pour conserver les “unités” associées à la magnitude :
class Timer { typedef std::chrono::high_resolution_clock Time; typedef std::chrono::duration duration; Time::time_point m_timestamp; duration currentElapsed; public: Timer() : m_timestamp(Time::now()) {} duration getTimeElapsed() const { return currentElapsed; } void Tick() { auto now = Time::now(); currentElapsed = now - m_timestamp; m_timestamp = now; } };