Index: cc/frame_rate_counter.cc |
diff --git a/cc/frame_rate_counter.cc b/cc/frame_rate_counter.cc |
index 7ff1edc54fa50d017b88288979e018526c94c2d6..58a2cebfee287f0ba2c1a76025a2495b56d79240 100644 |
--- a/cc/frame_rate_counter.cc |
+++ b/cc/frame_rate_counter.cc |
@@ -83,11 +83,13 @@ bool FrameRateCounter::isBadFrame(int frameNumber) const |
void FrameRateCounter::getAverageFPSAndStandardDeviation(double& averageFPS, double& standardDeviation) const |
egraether
2012/10/26 00:06:52
I refactored this method, because it was hard to r
|
{ |
- 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 +100,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) |
egraether
2012/10/26 00:06:52
This is a fix for a divide by zero error. It made
|
+ standardDeviation = sqrt(fpsVarianceNumerator / frameCount); |
} |
-base::TimeTicks FrameRateCounter::timeStampOfRecentFrame(int n) |
+base::TimeTicks FrameRateCounter::timeStampOfRecentFrame(int n) const |
{ |
DCHECK(n >= 0); |
DCHECK(n < kTimeStampHistorySize); |