utils: Introduce E_Fps_Tracker 61/320561/1
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 4 Mar 2025 06:03:55 +0000 (15:03 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 5 Mar 2025 02:17:28 +0000 (11:17 +0900)
This is to reduce duplicate code calculating FPS based on current time.

Change-Id: I7f018f3dd57b88dad7d91a4177d94705a0c27e70

src/bin/Makefile.mk
src/bin/utils/e_fps_tracker.c [new file with mode: 0644]
src/bin/utils/e_fps_tracker_intern.h [new file with mode: 0644]

index 7782e71e61baa422278b40a625c38ca997ce7674..c3d29d0f1e68c1de612f2a99d02367ca3a8cc41d 100644 (file)
@@ -294,6 +294,7 @@ src/bin/utils/e_dbus_conn.c \
 src/bin/utils/e_msg.c \
 src/bin/utils/e_map.c \
 src/bin/utils/e_util_video.c \
+src/bin/utils/e_fps_tracker.c \
 src/bin/debug/e_info_server.c \
 src/bin/debug/e_test_helper.c \
 src/bin/debug/e_info_protocol.c \
diff --git a/src/bin/utils/e_fps_tracker.c b/src/bin/utils/e_fps_tracker.c
new file mode 100644 (file)
index 0000000..fac222d
--- /dev/null
@@ -0,0 +1,79 @@
+#include "e_fps_tracker_intern.h"
+
+#include <stdlib.h>
+#include <Ecore.h>
+
+struct _E_Fps_Tracker
+{
+   double               fps;
+   double               old_fps;
+   double               frametime;
+   double               time;
+   double               lapse;
+   int                  cframes;
+   int                  flapse;
+};
+
+E_Fps_Tracker *
+e_fps_tracker_create(void)
+{
+   E_Fps_Tracker *tracker;
+
+   tracker = calloc(1, sizeof(*tracker));
+   if (!tracker)
+     return NULL;
+
+   return tracker;
+}
+
+void
+e_fps_tracker_update(E_Fps_Tracker *tracker)
+{
+   double dt;
+   double tim;
+
+   tim = ecore_time_get();
+
+   dt = tim - tracker->frametime;
+
+   tracker->frametime = tim;
+   tracker->time += dt;
+   tracker->cframes++;
+
+   if (tracker->lapse == 0.0)
+     {
+        tracker->lapse = tim;
+        tracker->flapse = tracker->cframes;
+     }
+   else if ((tim - tracker->lapse) >= 0.5)
+     {
+        tracker->fps = (tracker->cframes - tracker->flapse) /
+           (tim - tracker->lapse);
+        tracker->lapse = tim;
+        tracker->flapse = tracker->cframes;
+        tracker->time = 0.0;
+     }
+}
+
+bool
+e_fps_tracker_fps_get(E_Fps_Tracker *tracker, double *fps)
+{
+   if (tracker->old_fps == tracker->fps)
+     return false;
+
+   if (tracker->fps > 0.0)
+     {
+        *fps = tracker->fps;
+        tracker->old_fps = tracker->fps;
+        return true;
+     }
+
+   return false;
+}
+
+void
+e_fps_tracker_destroy(E_Fps_Tracker *tracker)
+{
+   free(tracker);
+}
+
diff --git a/src/bin/utils/e_fps_tracker_intern.h b/src/bin/utils/e_fps_tracker_intern.h
new file mode 100644 (file)
index 0000000..1da59ed
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef E_FPS_TRACKER_INTERN_H
+#define E_FPS_TRACKER_INTERN_H
+
+#include <stdbool.h>
+
+typedef struct _E_Fps_Tracker E_Fps_Tracker;
+
+/**
+ * Creates an instance of E_Fps_Tracker
+ */
+E_Fps_Tracker *e_fps_tracker_create(void);
+
+/**
+ * Updates the FPS tracker
+ *
+ * This function updates the FPS tracker based on current time.
+ */
+void e_fps_tracker_update(E_Fps_Tracker *tracker);
+
+/**
+ * Gets the current FPS value
+ *
+ * This function returns current FPS value from the tracker.
+ */
+bool e_fps_tracker_fps_get(E_Fps_Tracker *tracker, double *fps);
+
+/**
+ * Destroys an instance of E_Fps_Tracker
+ */
+void e_fps_tracker_destroy(E_Fps_Tracker *tracker);
+
+#endif