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, 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
30AppTime::~AppTime( )
31{
32 glDeleteQueries(MAX_FRAMES, m_time_query);
33 release_text(m_console);
34}
35
36int 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
62int 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
App(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.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:135
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition window.cpp:126