From 932b60a12345aa2d97da7e0fa8ea237b5378b3d6 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Sat, 14 Aug 2010 21:15:44 +0000 Subject: [PATCH] Proper delta time computation in both the game and the editor. --- src/debugfps.cpp | 20 +++++++++++++++++++- src/gtk/editor.cpp | 20 ++++++++++++++------ src/test-map.cpp | 15 ++++++--------- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/debugfps.cpp b/src/debugfps.cpp index 9a1414f9..a0325403 100644 --- a/src/debugfps.cpp +++ b/src/debugfps.cpp @@ -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); diff --git a/src/gtk/editor.cpp b/src/gtk/editor.cpp index 0af8eab8..2a784e8b 100644 --- a/src/gtk/editor.cpp +++ b/src/gtk/editor.cpp @@ -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; diff --git a/src/test-map.cpp b/src/test-map.cpp index 0481ad35..fcc868d1 100644 --- a/src/test-map.cpp +++ b/src/test-map.cpp @@ -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;