fps_counter.cc 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/public/cpp/fps_counter.h"
  5. #include "base/logging.h"
  6. #include "ui/compositor/compositor.h"
  7. namespace ash {
  8. namespace {
  9. bool force_report_zero_animation_for_test = false;
  10. } // namespace
  11. FpsCounter::FpsCounter(ui::Compositor* compositor) : compositor_(compositor) {
  12. compositor_->AddObserver(this);
  13. start_frame_number_ = compositor->activated_frame_count();
  14. start_time_ = base::TimeTicks::Now();
  15. }
  16. FpsCounter::~FpsCounter() {
  17. if (compositor_)
  18. compositor_->RemoveObserver(this);
  19. }
  20. int FpsCounter::ComputeSmoothness() {
  21. if (!compositor_)
  22. return -1;
  23. int end_frame_number = compositor_->activated_frame_count();
  24. // Don't report zero animation as 100.
  25. if (!force_report_zero_animation_for_test &&
  26. end_frame_number <= start_frame_number_)
  27. return -1;
  28. base::TimeDelta elapsed = base::TimeTicks::Now() - start_time_;
  29. float refresh_rate = compositor_->refresh_rate();
  30. const int expected_frame_number = (refresh_rate * elapsed).InSeconds();
  31. int actual_frame_number = end_frame_number - start_frame_number_;
  32. int smoothness = actual_frame_number < expected_frame_number
  33. ? smoothness =
  34. 100 * actual_frame_number / expected_frame_number
  35. : 100;
  36. VLOG(1) << "Smoothness:" << smoothness
  37. << ", duration=" << elapsed.InMilliseconds()
  38. << ", actual_frame=" << actual_frame_number
  39. << ", expected_frame=" << expected_frame_number;
  40. return smoothness;
  41. }
  42. void FpsCounter::OnCompositingShuttingDown(ui::Compositor* compositor) {
  43. DCHECK_EQ(compositor_, compositor);
  44. compositor->RemoveObserver(this);
  45. compositor_ = nullptr;
  46. }
  47. // static
  48. void FpsCounter::SetForceReportZeroAnimationForTest(bool value) {
  49. force_report_zero_animation_for_test = value;
  50. }
  51. } // namespace ash