| Index: cc/debug/frame_rate_counter.cc
|
| diff --git a/cc/debug/frame_rate_counter.cc b/cc/debug/frame_rate_counter.cc
|
| deleted file mode 100644
|
| index 2f3b291fea900d4b50d8bb247606de34c3431c37..0000000000000000000000000000000000000000
|
| --- a/cc/debug/frame_rate_counter.cc
|
| +++ /dev/null
|
| @@ -1,148 +0,0 @@
|
| -// Copyright 2012 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 "cc/debug/frame_rate_counter.h"
|
| -
|
| -#include <algorithm>
|
| -#include <limits>
|
| -
|
| -#include "base/metrics/histogram.h"
|
| -#include "cc/trees/proxy.h"
|
| -
|
| -namespace cc {
|
| -
|
| -// The following constants are measured in seconds.
|
| -
|
| -// Two thresholds (measured in seconds) that describe what is considered to be a
|
| -// "no-op frame" that should not be counted.
|
| -// - if the frame is too fast, then given our compositor implementation, the
|
| -// frame probably was a no-op and did not draw.
|
| -// - if the frame is too slow, then there is probably not animating content, so
|
| -// we should not pollute the average.
|
| -static const double kFrameTooFast = 1.0 / 70.0;
|
| -static const double kFrameTooSlow = 1.0 / 4.0;
|
| -
|
| -// If a frame takes longer than this threshold (measured in seconds) then we
|
| -// (naively) assume that it missed a screen refresh; that is, we dropped a
|
| -// frame.
|
| -// TODO(brianderson): Determine this threshold based on monitor refresh rate,
|
| -// crbug.com/138642.
|
| -static const double kDroppedFrameTime = 1.0 / 50.0;
|
| -
|
| -// static
|
| -scoped_ptr<FrameRateCounter> FrameRateCounter::Create(bool has_impl_thread) {
|
| - return make_scoped_ptr(new FrameRateCounter(has_impl_thread));
|
| -}
|
| -
|
| -base::TimeDelta FrameRateCounter::RecentFrameInterval(size_t n) const {
|
| - DCHECK_GT(n, 0u);
|
| - DCHECK_LT(n, ring_buffer_.BufferSize());
|
| - return ring_buffer_.ReadBuffer(n) - ring_buffer_.ReadBuffer(n - 1);
|
| -}
|
| -
|
| -FrameRateCounter::FrameRateCounter(bool has_impl_thread)
|
| - : has_impl_thread_(has_impl_thread), dropped_frame_count_(0) {}
|
| -
|
| -void FrameRateCounter::SaveTimeStamp(base::TimeTicks timestamp, bool software) {
|
| - ring_buffer_.SaveToBuffer(timestamp);
|
| -
|
| - // Check if frame interval can be computed.
|
| - if (ring_buffer_.CurrentIndex() < 2)
|
| - return;
|
| -
|
| - base::TimeDelta frame_interval_seconds =
|
| - RecentFrameInterval(ring_buffer_.BufferSize() - 1);
|
| -
|
| - if (has_impl_thread_ && ring_buffer_.CurrentIndex() > 0) {
|
| - if (software) {
|
| - UMA_HISTOGRAM_CUSTOM_COUNTS(
|
| - "Renderer4.SoftwareCompositorThreadImplDrawDelay",
|
| - frame_interval_seconds.InMilliseconds(),
|
| - 1,
|
| - 120,
|
| - 60);
|
| - } else {
|
| - UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.CompositorThreadImplDrawDelay",
|
| - frame_interval_seconds.InMilliseconds(),
|
| - 1,
|
| - 120,
|
| - 60);
|
| - }
|
| - }
|
| -
|
| - if (!IsBadFrameInterval(frame_interval_seconds) &&
|
| - frame_interval_seconds.InSecondsF() > kDroppedFrameTime)
|
| - dropped_frame_count_ +=
|
| - frame_interval_seconds.InSecondsF() / kDroppedFrameTime;
|
| -}
|
| -
|
| -bool FrameRateCounter::IsBadFrameInterval(
|
| - base::TimeDelta interval_between_consecutive_frames) const {
|
| - double delta = interval_between_consecutive_frames.InSecondsF();
|
| - bool scheduler_allows_double_frames = !has_impl_thread_;
|
| - bool interval_too_fast =
|
| - scheduler_allows_double_frames ? delta < kFrameTooFast : delta <= 0.0;
|
| - bool interval_too_slow = delta > kFrameTooSlow;
|
| - return interval_too_fast || interval_too_slow;
|
| -}
|
| -
|
| -void FrameRateCounter::GetMinAndMaxFPS(double* min_fps, double* max_fps) const {
|
| - *min_fps = std::numeric_limits<double>::max();
|
| - *max_fps = 0.0;
|
| -
|
| - for (RingBufferType::Iterator it = --ring_buffer_.End(); it; --it) {
|
| - base::TimeDelta delta = RecentFrameInterval(it.index() + 1);
|
| -
|
| - if (IsBadFrameInterval(delta))
|
| - continue;
|
| -
|
| - DCHECK_GT(delta.InSecondsF(), 0.f);
|
| - double fps = 1.0 / delta.InSecondsF();
|
| -
|
| - *min_fps = std::min(fps, *min_fps);
|
| - *max_fps = std::max(fps, *max_fps);
|
| - }
|
| -
|
| - if (*min_fps > *max_fps)
|
| - *min_fps = *max_fps;
|
| -}
|
| -
|
| -double FrameRateCounter::GetAverageFPS() const {
|
| - int frame_count = 0;
|
| - double frame_times_total = 0.0;
|
| - double average_fps = 0.0;
|
| -
|
| - // Walk backwards through the samples looking for a run of good frame
|
| - // timings from which to compute the mean.
|
| - //
|
| - // Slow frames occur just because the user is inactive, and should be
|
| - // ignored. Fast frames are ignored if the scheduler is in single-thread
|
| - // mode in order to represent the true frame rate in spite of the fact that
|
| - // the first few swapbuffers happen instantly which skews the statistics
|
| - // too much for short lived animations.
|
| - //
|
| - // IsBadFrameInterval encapsulates the frame too slow/frame too fast logic.
|
| -
|
| - for (RingBufferType::Iterator it = --ring_buffer_.End();
|
| - it && frame_times_total < 1.0;
|
| - --it) {
|
| - base::TimeDelta delta = RecentFrameInterval(it.index() + 1);
|
| -
|
| - if (!IsBadFrameInterval(delta)) {
|
| - frame_count++;
|
| - frame_times_total += delta.InSecondsF();
|
| - } else if (frame_count) {
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (frame_count) {
|
| - DCHECK_GT(frame_times_total, 0.0);
|
| - average_fps = frame_count / frame_times_total;
|
| - }
|
| -
|
| - return average_fps;
|
| -}
|
| -
|
| -} // namespace cc
|
|
|