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