Index: chrome/browser/android/vr_shell/fps_meter.cc |
diff --git a/chrome/browser/android/vr_shell/fps_meter.cc b/chrome/browser/android/vr_shell/fps_meter.cc |
index 9065fd4350373435e2b0225e07c81db5999719a1..c6d03126d68eb83834ccf278de51a16d4591ae92 100644 |
--- a/chrome/browser/android/vr_shell/fps_meter.cc |
+++ b/chrome/browser/android/vr_shell/fps_meter.cc |
@@ -10,18 +10,40 @@ namespace vr_shell { |
namespace { |
-static constexpr size_t kNumFrameTimes = 10; |
+static constexpr size_t kDefaultNumFrameTimes = 10; |
-} // namepsace |
+} // namespace |
-FPSMeter::FPSMeter() : total_time_us_(0) { |
- frame_times_.reserve(kNumFrameTimes); |
+SampleQueue::SampleQueue(size_t window_size) : window_size_(window_size) { |
+ samples_.reserve(window_size); |
} |
-FPSMeter::~FPSMeter() {} |
+SampleQueue::~SampleQueue() = default; |
+ |
+void SampleQueue::AddSample(int64_t value) { |
+ sum_ += value; |
+ |
+ if (samples_.size() < window_size_) { |
+ samples_.push_back(value); |
+ } else { |
+ sum_ -= samples_[current_index_]; |
+ samples_[current_index_] = value; |
+ } |
+ |
+ ++current_index_; |
+ if (current_index_ >= window_size_) { |
+ current_index_ = 0; |
+ } |
+} |
+ |
+FPSMeter::FPSMeter() : frame_times_(kDefaultNumFrameTimes) {} |
+ |
+FPSMeter::FPSMeter(size_t window_size) : frame_times_(window_size) {} |
+ |
+FPSMeter::~FPSMeter() = default; |
size_t FPSMeter::GetNumFrameTimes() { |
- return kNumFrameTimes; |
+ return frame_times_.GetWindowSize(); |
} |
void FPSMeter::AddFrame(const base::TimeTicks& time_stamp) { |
@@ -30,25 +52,14 @@ void FPSMeter::AddFrame(const base::TimeTicks& time_stamp) { |
return; |
} |
- base::TimeDelta delta = time_stamp - last_time_stamp_; |
+ int64_t delta = (time_stamp - last_time_stamp_).InMicroseconds(); |
last_time_stamp_ = time_stamp; |
- total_time_us_ += delta.InMicroseconds(); |
- |
- if (frame_times_.size() < kNumFrameTimes) { |
- frame_times_.push_back(delta); |
- } else { |
- total_time_us_ -= frame_times_[current_index_].InMicroseconds(); |
- frame_times_[current_index_] = delta; |
- } |
- |
- current_index_++; |
- if (current_index_ >= kNumFrameTimes) |
- current_index_ = 0; |
+ frame_times_.AddSample(delta); |
} |
bool FPSMeter::CanComputeFPS() const { |
- return !frame_times_.empty(); |
+ return frame_times_.GetCount() > 0; |
} |
// Simply takes the average time delta. |
@@ -56,7 +67,21 @@ double FPSMeter::GetFPS() const { |
if (!CanComputeFPS()) |
return 0.0; |
- return (frame_times_.size() * 1.0e6) / total_time_us_; |
+ return (frame_times_.GetCount() * 1.0e6) / frame_times_.GetSum(); |
+} |
+ |
+SlidingAverage::SlidingAverage(size_t window_size) : values_(window_size) {} |
+ |
+SlidingAverage::~SlidingAverage() = default; |
+ |
+void SlidingAverage::AddSample(int64_t value) { |
+ values_.AddSample(value); |
+} |
+ |
+int64_t SlidingAverage::GetAverageOrDefault(int64_t default_value) const { |
+ if (values_.GetCount() == 0) |
+ return default_value; |
+ return values_.GetSum() / values_.GetCount(); |
} |
} // namespace vr_shell |