You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							40 lines
						
					
					
						
							1.0 KiB
						
					
					
				
			
		
		
	
	
							40 lines
						
					
					
						
							1.0 KiB
						
					
					
				#include "common/ratekeeper.h"
 | 
						|
 | 
						|
#include <algorithm>
 | 
						|
 | 
						|
#include "common/swaglog.h"
 | 
						|
#include "common/timing.h"
 | 
						|
#include "common/util.h"
 | 
						|
 | 
						|
RateKeeper::RateKeeper(const std::string &name, float rate, float print_delay_threshold)
 | 
						|
    : name(name),
 | 
						|
      print_delay_threshold(std::max(0.f, print_delay_threshold)) {
 | 
						|
  interval = 1 / rate;
 | 
						|
  last_monitor_time = seconds_since_boot();
 | 
						|
  next_frame_time = last_monitor_time + interval;
 | 
						|
}
 | 
						|
 | 
						|
bool RateKeeper::keepTime() {
 | 
						|
  bool lagged = monitorTime();
 | 
						|
  if (remaining_ > 0) {
 | 
						|
    util::sleep_for(remaining_ * 1000);
 | 
						|
  }
 | 
						|
  return lagged;
 | 
						|
}
 | 
						|
 | 
						|
bool RateKeeper::monitorTime() {
 | 
						|
  ++frame_;
 | 
						|
  last_monitor_time = seconds_since_boot();
 | 
						|
  remaining_ = next_frame_time - last_monitor_time;
 | 
						|
 | 
						|
  bool lagged = remaining_ < 0;
 | 
						|
  if (lagged) {
 | 
						|
    if (print_delay_threshold > 0 && remaining_ < -print_delay_threshold) {
 | 
						|
      LOGW("%s lagging by %.2f ms", name.c_str(), -remaining_ * 1000);
 | 
						|
    }
 | 
						|
    next_frame_time = last_monitor_time + interval;
 | 
						|
  } else {
 | 
						|
    next_frame_time += interval;
 | 
						|
  }
 | 
						|
  return lagged;
 | 
						|
}
 | 
						|
 |