Chromium Code Reviews| 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); |