Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1401 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  mesurer le framerate

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

mesurer le framerate

n°1165540
Amonchakai
Posté le 30-07-2005 à 14:28:47  profilanswer
 

Bonjour moi j'ai une petite question sur le framerate : j'aimerai bien savoir comment on fait pour le mesurer ???
En fait je sais qu'il faut utiliser la fonction :
   QueryPerformanceCounter()
ou QueryFrequency()  enfin là je sens que vous rigolez car je suis vraiment pas sur qu'elle s'appelle comme ça enfin vous m'avez compris.
 
Je suis déjà allé voir dans les topics et là tout le monde à l'air de savoir. D'ou je vous le demande un peu honteux comment on fait ? Je suis allé voir MSDN.microsoft.com et là il expliquent que la fonction QueryPerformanceCounter() renvoie une valeur non nulle si tout se passe bien et 0 si il y a une erreur. Mais je me demande : c'est quoi la valeur non nulle qu'elle renvoie ? j'ais pensé après quelques essais qu'il sagissait tout bêtement du temp qu'il a mis pour faire ce que je voulais et donc du temp pour dessiner une image. j'ais donc fait une règle de trois et j'en ai déduit que le nombre d'images affichée en 1 seconde était : 1 / QueryPerformanceCounter(&time).
 
mais c'est là que ça devient commique : en affichant j'obtient un résultat du même ordre de grandeur que QueryPerformanceCounter(&time) : un nombre tu type 0.0015 enfin du type avec deux chiffres derière la virgule. en fesant l'inverse j'aurais du avoir un truc très grand non ?
j'en ai deduit une relation très intérésante : "pour tout x appartenant a Glfloat, x = 1 / x" Genial non ???   :p  
( ha oui comme vous l'aurez remarqué je suis... non ... j'essai de faire de l'openGL : je suis assidument les cours de NeHe)
toujours est-t-il que j'ai quelques problèmes. A mon avis ça vient déjà du fait que je sais pas comment entre quel point et quel point QueryPerformanceCounter() fait la mesure. ou tout simplement de mon code car pour afficher ma mesure je fais un truc du genre :  
   printf("FPS : %f", 1 / QueryPerformanceCounter(&time));
bien sur je n'utilise pas printf mais une fonction qui a le même rôle en openGL  :D  
 
donc voilà voilà voilà j'espère que je vous ai pas trop enuyé avec mon histoire et l'on pourra m'aider.
 
   MERCI !!!

mood
Publicité
Posté le 30-07-2005 à 14:28:47  profilanswer
 

n°1165569
Amonchakai
Posté le 30-07-2005 à 15:40:59  profilanswer
 

Ca y est j'ai la solution : en fait mon truc marche très bien, tout viens de GLfloat :
je pense qu'en openGL l'opérateur + est surchargé et donc l'élément neutre de l'addition n'est plus 0 mais 1.  
Deplus GLfloat vérifie x = 1 / x.
1 appartient à GLfloat.
 
de part la caractéristion d'un sev (Sous Espace Vectoriel):
   GLfloat est une partie de R (ensemble des Réel)
   GLfloat non vide : contient 1;
   
soit (x,y) appartenant à GLfloat², (alpha,béta) appartenant à R²
alpha * x + béta * y = 1  
   /* car x = y = 1 qui est l'élément neutre de l'addition (penser à 0 * 3 = 0) avec 0 élément neutre usuel ... */
deplus alpha * x = 1 et béta * y = 1 //même raison que précédament
or 1 élément neutre de la loi +
donc (alpha * x) + (béta * y) = 1  
 
   GLfloat est donc stable par combinaison linéaire
 
DONC  GLfloat est un R-sev.
 
   deplus GLfloat est réduit au singleton {1}
   ainsi pour tout x appartenant à GLfloat x = 1
   
CONCLUSION :
   ma framerate est donc constante et égale à 1
 
mais encore plus chaud :
   on a 0.0015 et tout les nombres à virgules qui sont affichées quand j'affiche ma valeur contenue dans ma variable qui est en GLfloat ainsi on en déduit que tout les nombres à virgules sont égaux à 1...  :pt1cable:
  ca se complique alors : ma framerate serait égale à la fois 1 et à 0.0015 et 0.15 et ... comme tout ces chiffres sont égaux et au passage +infini est un nombre à virgule ???
j'en déduit donc que non seulement ma framerate vaut 1 mais aussi elle vaut +infini. J'ais donc créé le premier programme dont la framerate = +infini !!!!!!
 
   JE SUIS TROP FORT ET LA FOULE APPLAUDIE (applause) :)  
 
...
...
heu je me suis peut être un peu égaré dans ma demonstration... mais là je vois pas trop ce que je peut faire sinon faire éventuellement publier ma dem.

n°1165697
Joel F
Real men use unique_ptr
Posté le 30-07-2005 à 19:39:03  profilanswer
 

typedef flaot GLfloat dasn opengl.h .... faut arreter la moquette [:pingouino]

n°1165733
Amonchakai
Posté le 30-07-2005 à 20:23:06  profilanswer
 

heuu Joel F je comprend pas trop ta remarque...
 
Sinon j'ai trouvé une parcelle de code qui est sencé calculer ce que je cherche mais ça marche pas (d'ailleur je comprend pas ce qu'il fait)  

Citation :


LARGE_INTEGER time, last_time, diff, frequency;
float g_frame_time=0, g_total_time=0, lowest_fps=120.0f;
unsigned int number_frames=0, total_fps=0;
 
void CalcFrameTime(void)
{
 GLfloat frame_time;
 
 last_time = time;
 QueryPerformanceCounter(&time);
 
 diff.QuadPart = time.QuadPart - last_time.QuadPart;
 frame_time = (GLfloat)diff.QuadPart / (GLfloat)frequency.QuadPart;
 
 g_frame_time = frame_time;
 g_total_time += g_frame_time;
}


 
ce que je comprend déjà pas c'est pourquoi il ne récupère pas ce que rend QueryPerformanceCounter(&time); est ce que time serait modifié dans la fonction QueryPerformanceCounter() ??? pourtant dans MSDN il n'y a rien qui parle d'une modif de time !!!
et puis il ne touche pas a frequency si ce n'est pour récupérer la valeur !!!
Enfin je serai pas contre une petite aide Merci !!! :hello:  

n°1165771
WhatDe
Posté le 30-07-2005 à 21:23:24  profilanswer
 

:heink:

n°1166049
Amonchakai
Posté le 31-07-2005 à 15:54:01  profilanswer
 

OK, j'ai enfin fini par comprendre comment on fait !!! :bounce:  
mais bon quand même je trouve que dans MSDN c'était vachement mal expliqué : je vais y retourner maintenant que j'ai compris mais quand même... Effectivement quand om passe time à QueryPerformanceCounter(); il y a bien time qui est modifié et ça il ne le disait pas.
 
enfin bref j'ai trouvé un site qui montrait comment on fait et ... je vois pourquoi personne ne me répondait : c'est vraiment trop simple et tout le monde devait se foutre de ma gueule ... enfin pour les autres nul comme moi voilà la solution :

Citation :


  LARGE_INTEGER Frequency;
  LARGE_INTEGER Before, After;
  double Time;
 
  QueryPerformanceFrequency(&Frequency); /*si cette fonction renvoie 0, c'est le système ne supporte pas cette fonctionnalité */
  QueryPerformanceCounter(&Before); /* Mesure du temps avant */
 
  /* ... */
 
  QueryPerformanceCounter(&After); /* Mesure du temps après */
  Time = 1000.0 * (After.QuadPart - Before.QuadPart) / Frequency.QuadPart; /* Calcul du temps écoulé, en millisecondes */


 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  mesurer le framerate

 

Sujets relatifs
Compter les requetes et mesurer le trafic[DirectX] Framerate différent en fullscreen et windowed
[Batch] Script pour mesurer le temps de lancement d'une applicationquelle fonction pour mesurer le temps... si possible en ms voire moins
Mesurer le temps : précision 0.1 µs[c] Mesurer les temps d'exécution d'une fonction
Mesurer l'activité du CPU.[C] Comment mesurer le temps d'execution d'une fct ?
Comment mesurer la duree d'execution d'un programme en C ?comment mesurer la bande passante de mon site
Plus de sujets relatifs à : mesurer le framerate


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR