Index: cc/frame_rate_counter.cc |
diff --git a/cc/frame_rate_counter.cc b/cc/frame_rate_counter.cc |
index a02486bd0ec026e84e0d85f985f0d12ed7f3b15d..6bff0dd112b29fff7ba9f9a1b65775addb31f1e4 100644 |
--- a/cc/frame_rate_counter.cc |
+++ b/cc/frame_rate_counter.cc |
@@ -13,10 +13,6 @@ |
namespace cc { |
-const double CCFrameRateCounter::kFrameTooFast = 1.0 / 70.0; // measured in seconds |
-const double CCFrameRateCounter::kFrameTooSlow = 1.0 / 12.0; |
-const double CCFrameRateCounter::kDroppedFrameTime = 1.0 / 50.0; |
- |
// safeMod works on -1, returning m-1 in that case. |
static inline int safeMod(int number, int modulus) |
{ |
@@ -28,6 +24,20 @@ scoped_ptr<CCFrameRateCounter> CCFrameRateCounter::create() { |
return make_scoped_ptr(new CCFrameRateCounter()); |
} |
+void CCFrameRateCounter::setTimebaseAndInterval(base::TimeTicks timebase, base::TimeDelta interval) |
+{ |
+ if (interval != m_interval) { |
+ base::TimeTicks now = base::TimeTicks::Now(); |
+ if (m_interval != base::TimeDelta()) |
+ m_vsyncCount += (now - m_intervalChangedTime + (m_interval/2)) / m_interval; |
+ m_intervalChangedTime = now; |
+ m_interval = interval; |
+ } |
+ |
+ m_frameTooFastSeconds = 0.8 * interval.InSecondsF(); |
+ m_frameTooSlowSeconds = 1.0 / 12.0; |
+} |
+ |
inline base::TimeDelta CCFrameRateCounter::frameInterval(int frameNumber) const |
{ |
return m_timeStampHistory[frameIndex(frameNumber)] - |
@@ -40,9 +50,12 @@ inline int CCFrameRateCounter::frameIndex(int frameNumber) const |
} |
CCFrameRateCounter::CCFrameRateCounter() |
- : m_currentFrameNumber(1) |
- , m_droppedFrameCount(0) |
+ : m_vsyncCount(0) |
+ , m_currentFrameNumber(1) |
{ |
+ setTimebaseAndInterval( |
+ base::TimeTicks(), base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / 60)); |
reveman
2012/10/17 19:32:30
this assumes that 60FPS is the initial frame rate,
brianderson
2012/10/17 22:34:48
Done.
|
+ |
m_timeStampHistory[0] = base::TimeTicks::Now(); |
m_timeStampHistory[1] = m_timeStampHistory[0]; |
for (int i = 2; i < kTimeStampHistorySize; i++) |
@@ -59,9 +72,6 @@ void CCFrameRateCounter::markBeginningOfFrame(base::TimeTicks timestamp) |
WebKit::Platform::current()->histogramCustomCounts("Renderer4.CompositorThreadImplDrawDelay", static_cast<int>(drawDelayMs), 1, 120, 60); |
} |
- if (!isBadFrameInterval(frameIntervalSeconds) && |
- frameIntervalSeconds.InSecondsF() > kDroppedFrameTime) |
- ++m_droppedFrameCount; |
} |
void CCFrameRateCounter::markEndOfFrame() |
@@ -72,8 +82,8 @@ void CCFrameRateCounter::markEndOfFrame() |
bool CCFrameRateCounter::isBadFrameInterval(base::TimeDelta intervalBetweenConsecutiveFrames) const |
{ |
bool schedulerAllowsDoubleFrames = !CCProxy::hasImplThread(); |
- bool intervalTooFast = schedulerAllowsDoubleFrames && intervalBetweenConsecutiveFrames.InSecondsF() < kFrameTooFast; |
- bool intervalTooSlow = intervalBetweenConsecutiveFrames.InSecondsF() > kFrameTooSlow; |
+ bool intervalTooFast = schedulerAllowsDoubleFrames && intervalBetweenConsecutiveFrames.InSecondsF() < m_frameTooFastSeconds; |
+ bool intervalTooSlow = intervalBetweenConsecutiveFrames.InSecondsF() > m_frameTooSlowSeconds; |
return intervalTooFast || intervalTooSlow; |
} |
@@ -131,5 +141,17 @@ base::TimeTicks CCFrameRateCounter::timeStampOfRecentFrame(int n) |
return m_timeStampHistory[desiredIndex]; |
} |
+void CCFrameRateCounter::renderingStats(CCRenderingStats* stats) const |
+{ |
+ base::TimeTicks now = base::TimeTicks::Now(); |
+ |
+ stats->vsyncCount = m_vsyncCount; |
+ if (m_interval != base::TimeDelta()) |
+ stats->vsyncCount += (now - m_intervalChangedTime + (m_interval/2)) / m_interval; |
reveman
2012/10/17 19:32:30
this same logic is used in setTimebaseAndInterval.
brianderson
2012/10/17 22:34:48
Done.
|
+ |
+ stats->rendererFrameCount = m_currentFrameNumber - 1; |
+ stats->droppedFrameCount = stats->vsyncCount - (m_currentFrameNumber - 1); |
reveman
2012/10/17 19:32:30
Looks like droppedFrameCount is unnecessary. Shoul
brianderson
2012/10/17 22:34:48
I think it would be nice to keep it as a separate
|
+} |
+ |
} // namespace cc |