Index: cc/frame_rate_counter.cc |
diff --git a/cc/frame_rate_counter.cc b/cc/frame_rate_counter.cc |
index c37956f78c8d06f0e2c1a68a611c9bce17ecf215..4ebd8b642dd8e5f079780437ac22f801cc25c0dc 100644 |
--- a/cc/frame_rate_counter.cc |
+++ b/cc/frame_rate_counter.cc |
@@ -4,7 +4,7 @@ |
#include "cc/frame_rate_counter.h" |
-#include <cmath> |
+#include <limits> |
#include "base/metrics/histogram.h" |
#include "cc/proxy.h" |
@@ -15,12 +15,6 @@ const double FrameRateCounter::kFrameTooFast = 1.0 / 70.0; // measured in second |
const double FrameRateCounter::kFrameTooSlow = 1.0 / 4.0; |
const double FrameRateCounter::kDroppedFrameTime = 1.0 / 50.0; |
-// safeMod works on -1, returning m-1 in that case. |
-static inline int safeMod(int number, int modulus) |
-{ |
- return (number + modulus) % modulus; |
-} |
- |
// static |
scoped_ptr<FrameRateCounter> FrameRateCounter::create(bool hasImplThread) { |
return make_scoped_ptr(new FrameRateCounter(hasImplThread)); |
@@ -28,45 +22,32 @@ scoped_ptr<FrameRateCounter> FrameRateCounter::create(bool hasImplThread) { |
inline base::TimeDelta FrameRateCounter::frameInterval(int frameNumber) const |
{ |
- return m_timeStampHistory[frameIndex(frameNumber)] - |
- m_timeStampHistory[frameIndex(frameNumber - 1)]; |
-} |
- |
-inline int FrameRateCounter::frameIndex(int frameNumber) const |
-{ |
- return safeMod(frameNumber, kTimeStampHistorySize); |
+ return m_buffer[bufferIndex(frameNumber)] - m_buffer[bufferIndex(frameNumber - 1)]; |
} |
FrameRateCounter::FrameRateCounter(bool hasImplThread) |
: m_hasImplThread(hasImplThread) |
- , m_currentFrameNumber(1) |
, m_droppedFrameCount(0) |
{ |
- m_timeStampHistory[0] = base::TimeTicks::Now(); |
- m_timeStampHistory[1] = m_timeStampHistory[0]; |
- for (int i = 2; i < kTimeStampHistorySize; i++) |
- m_timeStampHistory[i] = base::TimeTicks(); |
+ m_buffer[0] = m_buffer[1] = base::TimeTicks::Now(); |
+ m_currentIndex = 1; |
+ for (int i = 2; i < bufferSize(); i++) |
+ m_buffer[i] = base::TimeTicks(); |
} |
-void FrameRateCounter::markBeginningOfFrame(base::TimeTicks timestamp) |
+void FrameRateCounter::saveTimeStamp(base::TimeTicks timestamp) |
{ |
- m_timeStampHistory[frameIndex(m_currentFrameNumber)] = timestamp; |
- base::TimeDelta frameIntervalSeconds = frameInterval(m_currentFrameNumber); |
+ saveToBuffer(timestamp); |
+ base::TimeDelta frameIntervalSeconds = frameInterval(m_currentIndex); |
- if (m_hasImplThread && m_currentFrameNumber > 0) { |
+ if (m_hasImplThread && m_currentIndex > 0) |
HISTOGRAM_CUSTOM_COUNTS("Renderer4.CompositorThreadImplDrawDelay", frameIntervalSeconds.InMilliseconds(), 1, 120, 60); |
- } |
if (!isBadFrameInterval(frameIntervalSeconds) && |
frameIntervalSeconds.InSecondsF() > kDroppedFrameTime) |
++m_droppedFrameCount; |
} |
-void FrameRateCounter::markEndOfFrame() |
-{ |
- m_currentFrameNumber += 1; |
-} |
- |
bool FrameRateCounter::isBadFrameInterval(base::TimeDelta intervalBetweenConsecutiveFrames) const |
{ |
double delta = intervalBetweenConsecutiveFrames.InSecondsF(); |
@@ -76,14 +57,30 @@ bool FrameRateCounter::isBadFrameInterval(base::TimeDelta intervalBetweenConsecu |
return intervalTooFast || intervalTooSlow; |
} |
-bool FrameRateCounter::isBadFrame(int frameNumber) const |
+void FrameRateCounter::getMinAndMaxFPS(double& minFPS, double& maxFPS) const |
{ |
- return isBadFrameInterval(frameInterval(frameNumber)); |
+ minFPS = std::numeric_limits<double>::max(); |
+ maxFPS = 0; |
+ |
+ for (int i = m_currentIndex - 1; i > 0 && bufferIndex(i) != bufferIndex(m_currentIndex); --i) { |
+ base::TimeDelta delta = frameInterval(i); |
+ |
+ if (isBadFrameInterval(delta)) |
+ continue; |
+ |
+ double fps = 1.0 / delta.InSecondsF(); |
+ |
+ minFPS = std::min(fps, minFPS); |
+ maxFPS = std::max(fps, maxFPS); |
+ } |
+ |
+ if (minFPS > maxFPS) |
+ minFPS = maxFPS; |
} |
double FrameRateCounter::getAverageFPS() const |
{ |
- int frameNumber = m_currentFrameNumber - 1; |
+ int frameNumber = m_currentIndex - 1; |
int frameCount = 0; |
double frameTimesTotal = 0; |
double averageFPS = 0; |
@@ -99,7 +96,7 @@ double FrameRateCounter::getAverageFPS() const |
// |
// isBadFrameInterval encapsulates the frame too slow/frame too fast logic. |
- while (frameIndex(frameNumber) != frameIndex(m_currentFrameNumber) && frameNumber >= 0 && frameTimesTotal < 1.0) { |
+ while (bufferIndex(frameNumber) != bufferIndex(m_currentIndex) && frameNumber >= 0 && frameTimesTotal < 1.0) { |
base::TimeDelta delta = frameInterval(frameNumber); |
if (!isBadFrameInterval(delta)) { |
@@ -117,12 +114,4 @@ double FrameRateCounter::getAverageFPS() const |
return averageFPS; |
} |
-base::TimeTicks FrameRateCounter::timeStampOfRecentFrame(int n) const |
-{ |
- DCHECK(n >= 0); |
- DCHECK(n < kTimeStampHistorySize); |
- int desiredIndex = (frameIndex(m_currentFrameNumber) + n) % kTimeStampHistorySize; |
- return m_timeStampHistory[desiredIndex]; |
-} |
- |
} // namespace cc |