Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1650)

Unified Diff: cc/frame_rate_counter.cc

Issue 11028021: cc: Improve frame/commit accounting (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Make it work in single tread mode. Get rid of active concept. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/frame_rate_counter.h ('k') | cc/layer_tree_host.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « cc/frame_rate_counter.h ('k') | cc/layer_tree_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698