gamnit: make `SpriteSet` public so clients can use its services
[nit.git] / lib / mnit / mnit_fps.nit
index 38f0d48..f4abd92 100644 (file)
@@ -24,7 +24,11 @@ redef class App
        # Zero (or a negative value) means no limit.
        #
        # Applications can modify this value even during the main-loop.
-       var maximum_fps writable = 60
+       var maximum_fps = 60.0 is writable
+
+       # Current frame-rate
+       # Updated each 5 seconds.
+       var current_fps = 0.0
 
        redef fun full_frame
        do
@@ -35,20 +39,36 @@ redef class App
        # The clock for limit_fps
        private var clock = new Clock
 
+       # Number of frames since the last deadline
+       # Used tocompute `current_fps`.
+       private var frame_count = 0
+
+       # Deadline used to compute `current_fps`
+       private var frame_count_deadline = 0.0
+
        # Check and sleep to maitain a frame-rate bellow `maximum_fps`
+       # Also periodically uptate `current_fps`
        # Is automatically called at the end of `full_frame`.
        fun limit_fps
        do
+               var t = clock.total
+               if t >= frame_count_deadline then
+                       var cfps = frame_count.to_f / 5.0
+                       self.current_fps = cfps
+                       frame_count = 0
+                       frame_count_deadline = t + 5.0
+               end
+               frame_count += 1
+
                var mfps = maximum_fps
-               if mfps <= 0 then return
-               var dt = clock.lapse
-               var target_dt = 1000000000 / mfps
-               var sec = dt.sec
-               var nanosec = dt.nanosec
-               if sec == 0 and nanosec < target_dt then
-                       var sleep_t = target_dt - nanosec
-                       sys.nanosleep(0, sleep_t)
-                       dt = clock.lapse
+               if mfps <= 0.0 then return
+               var lapse = clock.lapse
+               var dt = lapse.to_f
+               var target_dt = 1.0 / mfps
+               if dt < target_dt then
+                       var sleep_t = target_dt - dt
+                       sleep_t.sleep
+                       clock.lapse
                end
        end
 end