X-Git-Url: http://nitlanguage.org diff --git a/lib/mnit/mnit_fps.nit b/lib/mnit/mnit_fps.nit index 38f0d48..f4abd92 100644 --- a/lib/mnit/mnit_fps.nit +++ b/lib/mnit/mnit_fps.nit @@ -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