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
+
+
+
+
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);