class FpsHandler : public osgGA::GUIEventHandler
{
public:
FpsHandler(const boost::shared_ptr<double> & fps):
m_fps(fps),
m_previousTime(0)
{
}
private:
bool handle(const osgGA::GUIEventAdapter & ea,
osgGA::GUIActionAdapter &)
{
switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter::FRAME):
{
double currentTime = ea.getTime();
double diff = currentTime - m_previousTime;
if(diff > 0)
{
*m_fps = 1 / diff;
}
else
{
*m_fps = 0;
}
m_previousTime = currentTime;
break;
}
default:
break;
}
return false;
}
boost::shared_ptr<double> m_fps;
double m_previousTime;
};
Depuis mon programme, j'insère mon FpsHandler dans mon viewer, puis je créé un événement wxWidgets qui va lire ce temps toutes les secondes et l'afficher. Difficile de faire plus simple!
En bonus, ces handlers sont totalement indépendants du reste du code. Alors que j'ai déjà implémenté une multitude de calculateurs d'images par secondes dans les divers frameworks que j'utilise (SDL, Sfml, wxWidgets...), celui-ci peut simplement dormir dans une bibliothèque d'utilitaires OSG, et être utilisé dans n'importe quelle application.
Puisque les handlers s'ajoutent au viewer, il est ainsi possible de concevoir un grand nombre de composants résolvant chacun un problème donné, et de les combiner dans un programme.
They're also great to record videos of the scene.
RépondreSupprimer