diff --git a/res/ui/ui.glade b/res/ui/ui.glade index 62d79c3..62ebf88 100644 --- a/res/ui/ui.glade +++ b/res/ui/ui.glade @@ -1489,7 +1489,7 @@ False True - 1 + 0 @@ -1505,7 +1505,7 @@ False True - 2 + 1 @@ -1518,6 +1518,84 @@ True + + False + True + 2 + + + + + True + False + 0 + none + + + True + False + 12 + + + + True + False + + + True + False + FPS: + + + 0 + 0 + + + + + True + False + Satellites: + + + 0 + 1 + + + + + True + False + - + + + 1 + 0 + + + + + True + False + - + + + 1 + 1 + + + + + + + + + True + False + Performance + + + False True diff --git a/src/entity/satellite.c b/src/entity/satellite.c index 2e963cc..7ed6756 100644 --- a/src/entity/satellite.c +++ b/src/entity/satellite.c @@ -15,6 +15,7 @@ #include "download.h" #include "error.h" #include "gfx.h" +#include "perf.h" #include "phys.h" #include "shader.h" #include "status.h" @@ -279,6 +280,7 @@ void satellites_get_sync(void) satellites_renderable = FALSE; status_pop(STAT_FETCHING_SAT); catalog_satellites_fill(satellites, n_satellites); + perf_set_num_satellites(n_satellites); } void satellites_phys_sync(void) diff --git a/src/gfx/gfx.c b/src/gfx/gfx.c index 2553ec3..d1fd916 100644 --- a/src/gfx/gfx.c +++ b/src/gfx/gfx.c @@ -3,6 +3,7 @@ #include "camera.h" #include "error.h" #include "info.h" +#include "perf.h" #include "render.h" #include "thread.h" #include "timemgr.h" @@ -53,6 +54,7 @@ gboolean on_glarea_render(GtkGLArea *area, GdkGLContext *context, gpointer user_ render_process(); timemgr_tic(); info_tic(); + perf_tic(); #ifndef NO_SATELLITE thread_join_if_finished(THRD_SATELLITES_GET); #endif diff --git a/src/ui/perf.c b/src/ui/perf.c new file mode 100644 index 0000000..9bd25c7 --- /dev/null +++ b/src/ui/perf.c @@ -0,0 +1,55 @@ +#include "perf.h" + +#include "satellite.h" +#include "system.h" + +#define NUM_FRAMETIMES 30 + +static gboolean visible = FALSE; + +static GtkLabel *fps_lbl; +static GtkLabel *num_satellites_lbl; + +static gint64 prev_epoch_ms; +static int frametimes[NUM_FRAMETIMES] = { 0 }; +static int frametime_total = 0; +static unsigned frame_idx = 0; + +void perf_init(GtkBuilder *builder) +{ + fps_lbl = GTK_LABEL(gtk_builder_get_object(builder, "fps")); + num_satellites_lbl = GTK_LABEL(gtk_builder_get_object(builder, "num_satellites")); +} + +void perf_set_num_satellites(unsigned num_satellites) +{ + gchar *text = g_strdup_printf("%u", num_satellites); + gtk_label_set_text(num_satellites_lbl, text); + g_free(text); +} + +void perf_show(void) +{ + visible = TRUE; +} + +void perf_hide(void) +{ + visible = FALSE; +} + +void perf_tic(void) +{ + frametime_total -= frametimes[frame_idx]; + gint64 epoch_ms = system_epoch_ms(); + frametimes[frame_idx] = epoch_ms - prev_epoch_ms; + prev_epoch_ms = epoch_ms; + frametime_total += frametimes[frame_idx]; + frame_idx = (frame_idx + 1) % NUM_FRAMETIMES; + + if (visible) { + gchar *text = g_strdup_printf("%.1f", (NUM_FRAMETIMES * 1000.f) / frametime_total); + gtk_label_set_text(fps_lbl, text); + g_free(text); + } +} diff --git a/src/ui/perf.h b/src/ui/perf.h new file mode 100644 index 0000000..91682a5 --- /dev/null +++ b/src/ui/perf.h @@ -0,0 +1,14 @@ +#ifndef __PERF_H__ +#define __PERF_H__ + +#include "ui.h" + +void perf_init(GtkBuilder *builder); + +void perf_set_num_satellites(unsigned num_satellites); +void perf_tic(void); + +void perf_show(void); +void perf_hide(void); + +#endif /* __PERF_H__ */ diff --git a/src/ui/setting.c b/src/ui/setting.c index 182e847..f2e3362 100644 --- a/src/ui/setting.c +++ b/src/ui/setting.c @@ -1,5 +1,7 @@ #include "setting.h" +#include "perf.h" + struct Setting { char *id; GtkToggleButton *button; @@ -36,6 +38,7 @@ void on_settings_clicked(GtkToolButton *toolbutton, gpointer user_data) (void)toolbutton; (void)user_data; gtk_widget_show_all(GTK_WIDGET(window_settings)); + perf_show(); } gboolean on_window_settings_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) @@ -44,6 +47,7 @@ gboolean on_window_settings_delete_event(GtkWidget *widget, GdkEvent *event, gpo (void)event; (void)user_data; gtk_widget_hide(GTK_WIDGET(window_settings)); + perf_hide(); return TRUE; } diff --git a/src/ui/ui.c b/src/ui/ui.c index 511315f..6ecf44f 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -7,6 +7,7 @@ #include "gfx.h" #include "info.h" #include "input.h" +#include "perf.h" #include "render.h" #include "setting.h" #include "status.h" @@ -70,6 +71,7 @@ void ui_init(int argc, char ***argv) setting_init(builder); info_init(builder); filter_init(builder); + perf_init(builder); gtk_builder_connect_signals(builder, NULL);