16 log_dev_every(4500 * US_PER_MS_INT,
"[%s] %.1f fps (%llu frames in %.1fs)", tracker_name, actual_fps,
29 context, late_ms, expected_ms, actual_ms, actual_fps);
42 tracker->frame_count = 0;
43 tracker->expected_fps = expected_fps > 0 ? expected_fps : 60;
44 tracker->tracker_name = name ? name :
"FPS";
45 tracker->report_interval_ns = report_interval_ns;
48 tracker->last_fps_report_ns = 0;
49 tracker->last_frame_time_ns = 0;
52void fps_frame_ns(fps_t *tracker, uint64_t current_time_ns,
const char *context) {
58 if (tracker->last_fps_report_ns == 0) {
59 tracker->last_fps_report_ns = current_time_ns;
60 tracker->last_frame_time_ns = current_time_ns;
63 tracker->frame_count++;
66 uint64_t frame_interval_ns =
time_elapsed_ns(tracker->last_frame_time_ns, current_time_ns);
67 tracker->last_frame_time_ns = current_time_ns;
71 uint64_t expected_interval_ns = NS_PER_SEC_INT / (uint64_t)tracker->expected_fps;
72 uint64_t lag_threshold_ns = expected_interval_ns + (expected_interval_ns / 2);
75 if (tracker->frame_count > 1 && frame_interval_ns > lag_threshold_ns) {
76 const char *context_str = context ? context :
"Frame";
79 double late_ms = time_ns_to_us(frame_interval_ns - expected_interval_ns) / 1000.0;
80 double expected_ms = time_ns_to_us(expected_interval_ns) / 1000.0;
81 double actual_ms = time_ns_to_us(frame_interval_ns) / 1000.0;
82 double actual_fps = 1e9 / (double)frame_interval_ns;
84 log_lag_event(tracker->tracker_name, context_str, late_ms, expected_ms, actual_ms, actual_fps);
88 uint64_t elapsed_ns =
time_elapsed_ns(tracker->last_fps_report_ns, current_time_ns);
90 if (elapsed_ns >= tracker->report_interval_ns) {
91 double elapsed_seconds = time_ns_to_s(elapsed_ns);
92 double actual_fps = (double)tracker->frame_count / elapsed_seconds;
93 log_fps_report(tracker->tracker_name, actual_fps, tracker->frame_count, elapsed_seconds);
96 tracker->frame_count = 0;
97 tracker->last_fps_report_ns = current_time_ns;