Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: Kromah le Avril 11, 2012, 03:17:26 pm

Titre: [SFML 2] Obtenir le nombre de FPS
Posté par: Kromah le Avril 11, 2012, 03:17:26 pm
Bonjour,
pour des raisons de compatibilité, j'ai du m'orienter vers SFML 2.0.
Je découvre peu à peu les nouveautés de certaines classes, et j'ai été surpris de remarquer que la fonction sf::Window::GetFrameTime() avait disparue. Je ne parviens pas à trouver son équivalent. Faut-il le calculer nous-même à l'aide d'un Clock?

Merci d'avance  :D
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Laurent le Avril 11, 2012, 03:30:50 pm
Citer
Faut-il le calculer nous-même à l'aide d'un Clock?
Oui. C'est en fait peu surprenant une fois que tu réalises que ça se code en une ligne :)

sf::Clock clock;
while (window.isOpen())
{
    ...

    sf::Time frameTime = clock.restart();
}
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Kromah le Avril 11, 2012, 03:35:55 pm
Compris, merci pour l'intérêt particulier que tu portes au forum, c'est vraiment agréable  ;D
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: gaulois94 le Avril 11, 2012, 06:28:51 pm
Laurent : pour être précis, je les coder avec u peu moins de dix lignes (et non une seul :p).

Pour te conseiller voici ce que j'ai fait :

Tu récupères le nombre de fois que t'a fait un display .
Une fois que t'arrive à une seconde, ce nombre de fois deviendra ton FPS :)

Après, à toit de gérer tout sa :p .
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Laurent le Avril 11, 2012, 08:25:28 pm
Bah, 1 / time marche pareil (surtout maintenant que SFML 2 a retrouvé une résolution sub-milliseconde), ça prend moins de code et au moins t'as pas à attendre une seconde pour que le FPS soit mis à jour.
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: gaulois94 le Avril 11, 2012, 10:02:54 pm
Sauf que là ben j'obtient des valeurs assés aux hasard j'ai envie de dire.

Voici le code :

m_clock.restart();
float framerate = 1 / (m_clock.getElapsedTime().asMillisecond() * 0.001);
std::cout << framerate << std::endl;

Bien entendu tout ceci est mis dans une boucle.

Voici ce que j'obtient à la fin :

13
62
52
62
62
62
62
58
62
62
12
62
62
62
62
62
62
62
62
62
18
62
62
62
62
62
62
58
62
62
15
62
62
62
62
62
62
62
62
62
20
62
62
62
62
62
62
62
62
43
16
62
62
62
62
62
62
62
62
58
16
40
62

La liste peut continuer encore longtemps :) . De plus, j'ai bien mis un framerate Limit à 60 FPS.

Merci d'avance :) .
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Lo-X le Avril 11, 2012, 11:25:47 pm
là tu restart la sf::Clock et tu récupère la valeur depuis le dernier restart à la ligne suivante. Ce que tu récupère c'est le temps écoulé entre les deux lignes

restart() revoie la valeur du chrono, ça revient à faire un getElapsedTime() puis un restart().

sf::Time frameTime = clock.restart();
float framerate = 1 / (frameTime.asMillisecond() * 0.001);
std::cout << framerate << std::endl;
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Laurent le Avril 11, 2012, 11:30:18 pm
Et... ça rime à quoi de faire asMilliseconds() * 0.001 ? :P
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Orwel le Avril 12, 2012, 12:06:09 am
Je pense que comptait le nombre de display est mieux, car quand on affiche un FPS supérieur à 1000 dans des test, c'est imposible à lire.

Citer
Et... ça rime à quoi de faire asMilliseconds() * 0.001 ?
Il transforme le temps depuis des Milisecons vers des secondes. Après, un petit tours sur la documentation ne fait jamais de mal  ::)

Sinon la question:
Pourquoi les valeurs sont bizarres???
Elle sont régulières, parfois une baisse de framerate, certainement dû à l'affichage en console.
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: gaulois94 le Avril 12, 2012, 07:33:41 am
Oui j'avais mis le restart à la fin (c'est un code équivalent à mon vrai code). Pourquoi en milliseconde ? Car mon EventManager compte en milliseconde (mon code est bien plus complexe que sa et j'ai essayer de mettre un code équivalent : codé le soir sa ne me réussis pas x) ). Brefs tu vois maintenant pourquoi c'est mieux de compter le nombre de display : sa ne peut se tromper ;) .

ps : merci mais je sais lire une doc et sais que les secondes existent x) . Dans mon code seulement, j'ai choisis de tout mettre en milliseconde (c'est pas uniquement le framerate ;) ).
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Orwel le Avril 12, 2012, 08:00:06 pm
Citer
Oui j'avais mis le restart à la fin (c'est un code équivalent à mon vrai code). Pourquoi en milliseconde ? Car mon EventManager compte en milliseconde (mon code est bien plus complexe que sa et j'ai essayer de mettre un code équivalent : codé le soir sa ne me réussis pas x) ). Brefs tu vois maintenant pourquoi c'est mieux de compter le nombre de display : sa ne peut se tromper ;)

unsigned int framerate = 1000 / frameTime.asMillisecond() ;ou unsigned float framerate = 1 / frameTime.asSeconds();
Dans ce cas, ceci peut-être plus simple  ;)
Désoler si tu l'a mal pris, je suis le premier à affirmer sans regarder la documentation. Cette réplique était plus tourné vers moi :-[
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: gaulois94 le Avril 12, 2012, 08:59:39 pm
Ne t'inquiète pas pour sa :p . Brefs, qui est la vrai version ? Mesurer les FPS directement, avec les time en une seul ligne de code, où bien compter le nombre de display ? Je pense que les deux sont correctes, mais c'est vrai que votre version semble plus précise et sera surement celle qui devra être retenu.
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: danman le Avril 12, 2012, 11:11:28 pm
Ca dépend de si tu veux mesurer la vitesse instantanée de l'affichage ou la vitesse moyenne sur un échantillon d'une seconde, ça reste une valeur de référence.

Généralement on mesure plutot la vitesse instantanée, de la même manière qu'une voiture qui roule a un certain moment a 90 km/h ne fera pas forcément 90km en une heure, ce qui nous intéresse est la vitesse à cet instant T et pas la distance parcouru au final avec du coup la vitesse moyenne pour réaliser cette distance en un temps t .
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Laurent le Avril 12, 2012, 11:16:59 pm
M'enfin, le FPS c'est juste une petite info qu'on affiche dans le coin de la fenêtre pour jauger vite fait des performances de l'appli, alors l'une ou l'autre méthode... clairement, on s'en fout ;D
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: gaulois94 le Avril 13, 2012, 11:56:51 am
Laurent : ceci peut être intéressant pour les déplacements d'un personnage dans un jeu :) . Danman : je comprends parfaitement et vais donc choisir la méthode de calcule du FPS à un instant T :)
Titre: Re : [SFML 2] Obtenir le nombre de FPS
Posté par: Laurent le Avril 13, 2012, 12:07:31 pm
Citer
Laurent : ceci peut être intéressant pour les déplacements d'un personnage dans un jeu
Non, pour ça on calcule le temps écoulé ; là on parle bien de FPS. On peut utiliser l'un pour calculer le second, mais on ne va jamais utiliser le FPS pour autre chose que voir les perfs de l'application.

Le calcul du temps écoulé pour mettre à jour la logique de l'application, c'est une tout autre affaire, et il y a différentes stratégies selon le but recherché.