| @@ -20,7 +20,10 @@ class DebugFpsData | |||
| { | |||
| friend class DebugFps; | |||
| static int const HISTORY = 30; | |||
| private: | |||
| float history[HISTORY]; | |||
| Font *font; | |||
| int frame; | |||
| }; | |||
| @@ -33,6 +36,8 @@ DebugFps::DebugFps() | |||
| { | |||
| data = new DebugFpsData(); | |||
| for (int i = 0; i < DebugFpsData::HISTORY; i++) | |||
| data->history[i] = 0.0f; | |||
| data->font = Forge::GetFont("gfx/font/ascii.png"); | |||
| data->frame = 0; | |||
| } | |||
| @@ -46,8 +51,21 @@ void DebugFps::TickRender(float delta_time) | |||
| { | |||
| Asset::TickGame(delta_time); | |||
| data->history[data->frame % DebugFpsData::HISTORY] = delta_time; | |||
| data->frame++; | |||
| float mean = 0.0f, max = 0.0f; | |||
| for (int i = 0; i < DebugFpsData::HISTORY; i++) | |||
| { | |||
| mean += data->history[i]; | |||
| if (data->history[i] > max) | |||
| max = data->history[i]; | |||
| } | |||
| mean /= DebugFpsData::HISTORY; | |||
| char buf[1024]; | |||
| sprintf(buf, "%3.2f fps (%i)", 1000.0f / delta_time, data->frame++); | |||
| sprintf(buf, "%3.2f ms (%3.2f fps) -- max %3.2f ms -- #%i", | |||
| mean, 1000.0f / mean, max, data->frame); | |||
| data->font->Print(10, 10, buf); | |||
| data->font->Print(11, 10, buf); | |||
| data->font->Print(10, 11, buf); | |||
| @@ -19,7 +19,11 @@ | |||
| #include "video.h" | |||
| #include "game.h" | |||
| volatile int quit = 0; | |||
| static volatile int quit = 0; | |||
| static GTimer *timer; | |||
| static float delta_time; | |||
| static int ticking = 0; | |||
| static gint main_quit(GtkWidget *widget, GdkEventExpose *event) | |||
| { | |||
| @@ -33,14 +37,16 @@ static gint main_quit(GtkWidget *widget, GdkEventExpose *event) | |||
| static gboolean tick(void *widget) | |||
| { | |||
| float const delta_time = 33.33333f; | |||
| // FIXME: do not do anything if the previous tick was too recent? | |||
| delta_time = 1000.0f * g_timer_elapsed(timer, NULL); | |||
| g_timer_start(timer); | |||
| // FIXME: only quit if all assets have been cleaned | |||
| if (quit) | |||
| return FALSE; | |||
| ticking = 1; | |||
| /* Tick the game */ | |||
| Ticker::TickGame(delta_time); | |||
| @@ -70,10 +76,9 @@ static gint draw(GtkWidget *widget, GdkEventExpose *event) | |||
| return TRUE; | |||
| /* OpenGL functions can be called only if make_current returns true */ | |||
| if (gtk_gl_area_make_current(GTK_GL_AREA(widget))) | |||
| if (ticking && gtk_gl_area_make_current(GTK_GL_AREA(widget))) | |||
| { | |||
| // FIXME: do not do anything if the game tick wasn't called? | |||
| float const delta_time = 33.33333f; | |||
| ticking = 0; | |||
| /* Clear the screen, tick the renderer, and show the frame */ | |||
| Video::Clear(); | |||
| @@ -87,6 +92,7 @@ static gint draw(GtkWidget *widget, GdkEventExpose *event) | |||
| int main(int argc, char **argv) | |||
| { | |||
| /* Initialize GTK */ | |||
| g_thread_init(NULL); | |||
| gtk_init(&argc, &argv); | |||
| if (gdk_gl_query() == FALSE) | |||
| @@ -151,6 +157,8 @@ int main(int argc, char **argv) | |||
| //gtk_idle_add(tick, glarea); | |||
| gtk_timeout_add(33, tick, glarea); | |||
| timer = g_timer_new(); | |||
| gtk_main(); | |||
| return EXIT_SUCCESS; | |||
| @@ -40,9 +40,7 @@ int main(int argc, char **argv) | |||
| SDL_WM_GrabInput(SDL_GRAB_ON); | |||
| /* Initialise timer */ | |||
| Uint32 start, ticks; | |||
| start = ticks = SDL_GetTicks(); | |||
| int frames = 0; | |||
| Uint32 ticks = SDL_GetTicks(); | |||
| /* Initialise OpenGL */ | |||
| Video::Setup(video->w, video->h); | |||
| @@ -56,7 +54,10 @@ int main(int argc, char **argv) | |||
| while (!game->Finished()) | |||
| { | |||
| float const delta_time = 33.33333f; | |||
| /* Compute delta time */ | |||
| Uint32 newticks = SDL_GetTicks(); | |||
| float delta_time = (float)(newticks - ticks); | |||
| ticks = newticks; | |||
| /* Tick the game */ | |||
| Ticker::TickGame(delta_time); | |||
| @@ -67,14 +68,10 @@ int main(int argc, char **argv) | |||
| SDL_GL_SwapBuffers(); | |||
| /* Clamp to desired framerate */ | |||
| while (SDL_GetTicks() < ticks + (delta_time - 0.5f)) | |||
| while (SDL_GetTicks() < ticks + (33.33333f - 0.5f)) | |||
| SDL_Delay(1); | |||
| ticks = SDL_GetTicks(); | |||
| frames++; | |||
| } | |||
| Uint32 total = SDL_GetTicks() - start; | |||
| printf("%f fps\n", 1000.0f * frames / total); | |||
| SDL_Quit(); | |||
| return EXIT_SUCCESS; | |||