blob: 6747f099a03f7c98ed1b8fad7462f09ba1157b13 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/public/cpp/fps_counter.h"
#include "ui/compositor/compositor.h"
namespace ash {
namespace {
bool force_report_zero_animation_for_test = false;
} // namespace
FpsCounter::FpsCounter(ui::Compositor* compositor) : compositor_(compositor) {
compositor_->AddObserver(this);
start_frame_number_ = compositor->activated_frame_count();
start_time_ = base::TimeTicks::Now();
}
FpsCounter::~FpsCounter() {
if (compositor_)
compositor_->RemoveObserver(this);
}
int FpsCounter::ComputeSmoothness() {
if (!compositor_)
return -1;
int end_frame_number = compositor_->activated_frame_count();
// Don't report zero animation as 100.
if (!force_report_zero_animation_for_test &&
end_frame_number <= start_frame_number_)
return -1;
base::TimeDelta elapsed = base::TimeTicks::Now() - start_time_;
float refresh_rate = compositor_->refresh_rate();
int expected_frame_number =
std::floor(refresh_rate * elapsed.InMillisecondsF() /
base::Time::kMillisecondsPerSecond);
int actual_frame_number = end_frame_number - start_frame_number_;
int smoothness = actual_frame_number < expected_frame_number
? smoothness =
100 * actual_frame_number / expected_frame_number
: 100;
VLOG(1) << "Smoothness:" << smoothness
<< ", duration=" << elapsed.InMilliseconds()
<< ", actual_frame=" << actual_frame_number
<< ", expected_frame=" << expected_frame_number;
return smoothness;
}
void FpsCounter::OnCompositingShuttingDown(ui::Compositor* compositor) {
DCHECK_EQ(compositor_, compositor);
compositor->RemoveObserver(this);
compositor_ = nullptr;
}
// static
void FpsCounter::SetForceReportZeroAnimationForTest(bool value) {
force_report_zero_animation_for_test = value;
}
} // namespace ash