# 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
# 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