gKit2 light
app_time.cpp
1 
2 #include <cstdio>
3 
4 #include "app_time.h"
5 #include "texture.h"
6 
7 
8 AppTime::AppTime( const int width, const int height, const int major, const int minor, const int samples )
9  : App(width, height, major, minor, samples)
10 {
11  // desactive vsync pour les mesures de temps
12  SDL_GL_SetSwapInterval(0);
13  printf("[Apptime] vsync OFF...\n");
14 
15  // requetes pour mesurer le temps gpu
16  m_frame= 0;
17  glGenQueries(MAX_FRAMES, m_time_query);
18 
19  // initialise les queries, plus simple pour demarrer
20  for(int i= 0; i < MAX_FRAMES; i++)
21  {
22  glBeginQuery(GL_TIME_ELAPSED, m_time_query[i]);
23  glEndQuery(GL_TIME_ELAPSED);
24  }
25 
26  // affichage du temps dans la fenetre
27  m_console= create_text();
28 }
29 
30 AppTime::~AppTime( )
31 {
32  glDeleteQueries(MAX_FRAMES, m_time_query);
33  release_text(m_console);
34 }
35 
36 int AppTime::prerender( )
37 {
38 #ifndef GK_RELEASE
39  // verifie que la requete est bien dispo sans attente...
40  {
41  GLuint ready= GL_FALSE;
42  glGetQueryObjectuiv(m_time_query[m_frame], GL_QUERY_RESULT_AVAILABLE, &ready);
43  if(ready != GL_TRUE)
44  printf("[oops] wait query, frame %d...\n", m_frame);
45  }
46 #endif
47 
48  // recupere la mesure precedente...
49  m_frame_time= 0;
50  glGetQueryObjecti64v(m_time_query[m_frame], GL_QUERY_RESULT, &m_frame_time);
51 
52  // prepare la mesure de la frame courante...
53  glBeginQuery(GL_TIME_ELAPSED, m_time_query[m_frame]);
54 
55  // mesure le temps d'execution du draw pour le cpu
56  // utilise std::chrono pour mesurer le temps cpu
57  m_cpu_start= std::chrono::high_resolution_clock::now();
58 
59  return update(global_time(), delta_time());
60 }
61 
62 int AppTime::postrender( )
63 {
64  m_cpu_stop= std::chrono::high_resolution_clock::now();
65  int cpu_time= std::chrono::duration_cast<std::chrono::microseconds>(m_cpu_stop - m_cpu_start).count();
66 
67  glEndQuery(GL_TIME_ELAPSED);
68 
69  // selectionne une requete pour la frame suivante...
70  m_frame= (m_frame + 1) % MAX_FRAMES;
71  // les requetes sont gerees en fifo...
72 
73  // afficher le texte
74  clear(m_console);
75  printf(m_console, 0, 1, "cpu %02dms %03dus", cpu_time / 1000, cpu_time % 1000);
76  printf(m_console, 0, 2, "gpu %02dms %03dus", int(m_frame_time / 1000000), int((m_frame_time / 1000) % 1000));
77 
78  // affiche le temps dans le terminal
79  //~ printf("cpu %02dms %03dus ", cpu_time / 1000, cpu_time % 1000);
80  //~ printf("gpu %02dms %03dus\n", int(m_frame_time/ 1000000), int((m_frame_time / 1000) % 1000));
81 
82  draw(m_console, window_width(), window_height());
83 
84  return 0;
85 }
AppTime(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
Definition: app_time.cpp:8
virtual int update(const float time, const float delta)
a deriver et redefinir pour animer les objets en fonction du temps.
Definition: app_time.h:31
classe application.
Definition: app.h:20
void clear(Text &text)
efface le contenu de la console.
Definition: text.cpp:72
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition: window.cpp:29
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition: text.cpp:140
Text create_text()
cree une console. a detruire avec release_text( ).
Definition: text.cpp:14
void release_text(Text &text)
detruit une console.
Definition: text.cpp:64
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition: window.cpp:25
float delta_time()
renvoie le temps ecoule depuis la derniere frame, en millisecondes.
Definition: window.cpp:137
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition: window.cpp:128