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;
 | |
| }
 | |
| 
 |