Index: cc/frame_rate_counter.cc |
diff --git a/cc/frame_rate_counter.cc b/cc/frame_rate_counter.cc |
index 46b51f4616ba6310bb21a49368efe6d54448dd07..93953ffe6e2cd36a48fc0459ca16f5c615197e76 100644 |
--- a/cc/frame_rate_counter.cc |
+++ b/cc/frame_rate_counter.cc |
@@ -70,9 +70,10 @@ void FrameRateCounter::markEndOfFrame() |
bool FrameRateCounter::isBadFrameInterval(base::TimeDelta intervalBetweenConsecutiveFrames) const |
{ |
+ double delta = intervalBetweenConsecutiveFrames.InSecondsF(); |
bool schedulerAllowsDoubleFrames = !Proxy::hasImplThread(); |
- bool intervalTooFast = schedulerAllowsDoubleFrames && intervalBetweenConsecutiveFrames.InSecondsF() < kFrameTooFast; |
- bool intervalTooSlow = intervalBetweenConsecutiveFrames.InSecondsF() > kFrameTooSlow; |
+ bool intervalTooFast = schedulerAllowsDoubleFrames ? delta < kFrameTooFast : delta <= 0.0; |
+ bool intervalTooSlow = delta > kFrameTooSlow; |
return intervalTooFast || intervalTooSlow; |
} |
@@ -83,11 +84,13 @@ bool FrameRateCounter::isBadFrame(int frameNumber) const |
void FrameRateCounter::getAverageFPSAndStandardDeviation(double& averageFPS, double& standardDeviation) const |
{ |
- int frame = m_currentFrameNumber - 1; |
- averageFPS = 0; |
- int averageFPSCount = 0; |
+ int frameNumber = m_currentFrameNumber - 1; |
+ int frameCount = 0; |
double fpsVarianceNumerator = 0; |
+ averageFPS = 0; |
+ standardDeviation = 0; |
+ |
// Walk backwards through the samples looking for a run of good frame |
// timings from which to compute the mean and standard deviation. |
// |
@@ -98,32 +101,29 @@ void FrameRateCounter::getAverageFPSAndStandardDeviation(double& averageFPS, dou |
// too much for short lived animations. |
// |
// isBadFrame encapsulates the frame too slow/frame too fast logic. |
- while (1) { |
- if (!isBadFrame(frame)) { |
- averageFPSCount++; |
- base::TimeDelta secForLastFrame = m_timeStampHistory[frameIndex(frame)] - |
- m_timeStampHistory[frameIndex(frame - 1)]; |
- double x = 1.0 / secForLastFrame.InSecondsF(); |
+ |
+ // Go through all available historical data. |
+ while (frameIndex(frameNumber) != frameIndex(m_currentFrameNumber) && frameNumber >= 0) { |
+ base::TimeDelta delta = frameInterval(frameNumber); |
+ |
+ if (!isBadFrameInterval(delta)) { |
+ frameCount++; |
+ double x = 1.0 / delta.InSecondsF(); |
double deltaFromAverage = x - averageFPS; |
// Change with caution - numerics. http://en.wikipedia.org/wiki/Standard_deviation |
- averageFPS = averageFPS + deltaFromAverage / averageFPSCount; |
- fpsVarianceNumerator = fpsVarianceNumerator + deltaFromAverage * (x - averageFPS); |
- } |
- if (averageFPSCount && isBadFrame(frame)) { |
+ averageFPS += deltaFromAverage / frameCount; |
+ fpsVarianceNumerator += deltaFromAverage * (x - averageFPS); |
+ } else if (frameCount) |
// We've gathered a run of good samples, so stop. |
break; |
- } |
- --frame; |
- if (frameIndex(frame) == frameIndex(m_currentFrameNumber) || frame < 0) { |
- // We've gone through all available historical data, so stop. |
- break; |
- } |
+ frameNumber--; |
} |
- standardDeviation = sqrt(fpsVarianceNumerator / averageFPSCount); |
+ if (frameCount) |
+ standardDeviation = sqrt(fpsVarianceNumerator / frameCount); |
} |
-base::TimeTicks FrameRateCounter::timeStampOfRecentFrame(int n) |
+base::TimeTicks FrameRateCounter::timeStampOfRecentFrame(int n) const |
{ |
DCHECK(n >= 0); |
DCHECK(n < kTimeStampHistorySize); |