Created
June 16, 2018 12:45
-
-
Save a-dminator/e17b9ae72648e25b1477293ba0ab52fe to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void doFrame(long frameTimeNanos, int frame) { | |
final long startNanos; | |
synchronized (mLock) { | |
if (!mFrameScheduled) { | |
return; // no work to do | |
} | |
if (DEBUG_JANK && mDebugPrintNextFrameTimeDelta) { | |
mDebugPrintNextFrameTimeDelta = false; | |
Log.d(TAG, "Frame time delta: " | |
+ ((frameTimeNanos - mLastFrameTimeNanos) * 0.000001f) + " ms"); | |
} | |
long intendedFrameTimeNanos = frameTimeNanos; | |
startNanos = System.nanoTime(); | |
final long jitterNanos = startNanos - frameTimeNanos; | |
if (jitterNanos >= mFrameIntervalNanos) { | |
final long skippedFrames = jitterNanos / mFrameIntervalNanos; | |
if (skippedFrames >= SKIPPED_FRAME_WARNING_LIMIT) { | |
Log.i(TAG, "Skipped " + skippedFrames + " frames! " | |
+ "The application may be doing too much work on its main thread."); | |
} | |
final long lastFrameOffset = jitterNanos % mFrameIntervalNanos; | |
if (DEBUG_JANK) { | |
Log.d(TAG, "Missed vsync by " + (jitterNanos * 0.000001f) + " ms " | |
+ "which is more than the frame interval of " | |
+ (mFrameIntervalNanos * 0.000001f) + " ms! " | |
+ "Skipping " + skippedFrames + " frames and setting frame " | |
+ "time to " + (lastFrameOffset * 0.000001f) + " ms in the past."); | |
} | |
frameTimeNanos = startNanos - lastFrameOffset; | |
} | |
if (frameTimeNanos < mLastFrameTimeNanos) { | |
if (DEBUG_JANK) { | |
Log.d(TAG, "Frame time appears to be going backwards. May be due to a " | |
+ "previously skipped frame. Waiting for next vsync."); | |
} | |
scheduleVsyncLocked(); | |
return; | |
} | |
mFrameInfo.setVsync(intendedFrameTimeNanos, frameTimeNanos); | |
mFrameScheduled = false; | |
mLastFrameTimeNanos = frameTimeNanos; | |
} | |
try { | |
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Choreographer#doFrame"); | |
AnimationUtils.lockAnimationClock(frameTimeNanos / TimeUtils.NANOS_PER_MS); | |
mFrameInfo.markInputHandlingStart(); | |
doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos); | |
mFrameInfo.markAnimationsStart(); | |
doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos); | |
mFrameInfo.markPerformTraversalsStart(); | |
doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos); | |
doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); | |
} finally { | |
AnimationUtils.unlockAnimationClock(); | |
Trace.traceEnd(Trace.TRACE_TAG_VIEW); | |
} | |
if (DEBUG_FRAMES) { | |
final long endNanos = System.nanoTime(); | |
Log.d(TAG, "Frame " + frame + ": Finished, took " | |
+ (endNanos - startNanos) * 0.000001f + " ms, latency " | |
+ (startNanos - frameTimeNanos) * 0.000001f + " ms."); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment