@@ -92,6 +92,7 @@ protected Choreographer initialValue() {
9292 private boolean mFrameScheduled ;
9393 private boolean mCallbacksRunning ;
9494 private long mLastFrameTimeNanos ;
95+ private long mFrameIntervalNanos ;
9596
9697 /**
9798 * Callback type: Input callback. Runs first.
@@ -116,6 +117,8 @@ private Choreographer(Looper looper) {
116117 mHandler = new FrameHandler (looper );
117118 mDisplayEventReceiver = USE_VSYNC ? new FrameDisplayEventReceiver (looper ) : null ;
118119 mLastFrameTimeNanos = Long .MIN_VALUE ;
120+ mFrameIntervalNanos = (long )(1000000000 /
121+ new Display (Display .DEFAULT_DISPLAY , null ).getRefreshRate ());
119122
120123 mCallbackQueues = new CallbackQueue [CALLBACK_LAST + 1 ];
121124 for (int i = 0 ; i <= CALLBACK_LAST ; i ++) {
@@ -343,17 +346,37 @@ private void scheduleFrameLocked(long now) {
343346 }
344347
345348 void doFrame (long timestampNanos , int frame ) {
349+ final long startNanos ;
346350 synchronized (mLock ) {
347351 if (!mFrameScheduled ) {
348352 return ; // no work to do
349353 }
350- mFrameScheduled = false ;
351- mLastFrameTimeNanos = timestampNanos ;
352- }
353354
354- final long startNanos ;
355- if (DEBUG ) {
356355 startNanos = System .nanoTime ();
356+ final long jitterNanos = startNanos - timestampNanos ;
357+ if (jitterNanos >= mFrameIntervalNanos ) {
358+ final long lastFrameOffset = jitterNanos % mFrameIntervalNanos ;
359+ if (DEBUG ) {
360+ Log .d (TAG , "Missed vsync by " + (jitterNanos * 0.000001f ) + " ms "
361+ + "which is more than the frame interval of "
362+ + (mFrameIntervalNanos * 0.000001f ) + " ms! "
363+ + "Setting frame time to " + (lastFrameOffset * 0.000001f )
364+ + " ms in the past." );
365+ }
366+ timestampNanos = startNanos - lastFrameOffset ;
367+ }
368+
369+ if (timestampNanos < mLastFrameTimeNanos ) {
370+ if (DEBUG ) {
371+ Log .d (TAG , "Frame time appears to be going backwards. May be due to a "
372+ + "previously skipped frame. Waiting for next vsync" );
373+ }
374+ scheduleVsyncLocked ();
375+ return ;
376+ }
377+
378+ mFrameScheduled = false ;
379+ mLastFrameTimeNanos = timestampNanos ;
357380 }
358381
359382 doCallbacks (Choreographer .CALLBACK_INPUT );
0 commit comments