Voilà j'ai installé à la maison Fraps et j'ai pu faire quelques tests.
Mon affichage du FPS donne les mêmes valeurs (à vu d'oeil) que Fraps.
Par contre je n'ai pas la même carte graphique qu'au boulot, c'est une AMD Radeon HD 6800.
Elle est plus puissante et le cas de cet après midi qui tournait autour de 30 FPS au boulot, se retrouve à 60 FPS chez moi. Puis au bout d'un moment la fonction display() n'est plus aussi gourmande et ça file à 145 FPS.
Comme tu me l'as demandé, j'ai fait un code minimal où je dessine un simple sf::CircleShape. J'y ai mi ma façon de calculer le FPS, ainsi que le temps moyen des parties dessin et display.
Chez moi, avec ma carte AMD, je tourne à 200FPS pendant un moment puis tout s'emballe et j'arrive à 2000+ FPS. En regardant le benchmark sous Fraps cela arrive après une vingtaine de secondes. Sur mon affichage console j'observe que le temps nécessaire pour la fonction display est de 4.5 msec, puis il tombe à 0.45 msec ce qui entraîne le pique de FPS.
ugo
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace std;
int main()
{
sf::RenderWindow window(sf::VideoMode(124*8, 124*8), "My window");
// Création d'un cercle de rayon 500 pixel
sf::CircleShape circle;
circle.setRadius(500.0f);
// Timers
sf::Clock clock;
float timerGlobal = 0.0f; // Pour mesurer le temps d'une frame
float timerDraw = 0.0f; // Mesure du temps passé à dessiner
float timerDisplay = 0.0f; // Mesure du temps pour window.display()
float t1,t2,t3,t4; // Pour stocker le temps facilement
unsigned nbFps = 0; // Pour compter le nombre d'image par seconde
///////////////////////////////////////////////////////////////////////////////////////
while (window.isOpen())
{
t1 = clock.getElapsedTime().asMilliseconds(); // on prend le temps en début de frame
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed) window.close();
}
t2 = clock.getElapsedTime().asMilliseconds();
///////////////////////////////////////////////////////////////////
// DESSIN
window.clear();
window.draw(circle);
t3 = clock.getElapsedTime().asMilliseconds();
timerDraw += t3 - t2;
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// DISPLAY
window.display();
t4 = clock.getElapsedTime().asMilliseconds() ;
timerDisplay += t4 - t3;
///////////////////////////////////////////////////////////////////
timerGlobal += t4 - t1; // ajout du temps de la frame (
nbFps++;
if(timerGlobal>1000.0f) // toutes les secondes on fait les comptes et on affiche les temps
{
cout << "FPS " << nbFps << '\n';
cout << "draw " << timerDraw/static_cast<float>(nbFps) << '\n';
cout << "display " << timerDisplay/static_cast<float>(nbFps) << "\n\n";
nbFps = 0; // reset des timers
timerDraw = 0.0f;
timerDisplay = 0.0f;
timerGlobal -= 1000.0f ; // on garde ce qui dépasse de la seconde
timerGlobal += (clock.getElapsedTime().asMilliseconds() - t4); // les sorties coutent , donc je les ajoute
}
} //Endwhile
///////////////////////////////////////////////////////////////////////////////////////
return 0;
}