@Override
    public void onVSync(VSyncMonitor monitor, long vsyncTimeMicros) {
      if (mNeedToRender) {
        if (mPendingSwapBuffers + mPendingRenders <= MAX_SWAP_BUFFER_COUNT) {
          mNeedToRender = false;
          mPendingRenders++;
          render();
        } else {
          TraceEvent.instant("ContentViewRenderView:bail");
        }
      }

      if (mVSyncListener != null) {
        if (mVSyncNotificationEnabled) {
          for (mCurrentVSyncListenersIterator.rewind();
              mCurrentVSyncListenersIterator.hasNext(); ) {
            mCurrentVSyncListenersIterator.next().onVSync(vsyncTimeMicros);
          }
          mVSyncMonitor.requestUpdate();
        } else {
          // Compensate for input event lag. Input events are delivered immediately on
          // pre-JB releases, so this adjustment is only done for later versions.
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            vsyncTimeMicros += INPUT_EVENT_LAG_FROM_VSYNC_MICROSECONDS;
          }
          mVSyncListener.updateVSync(vsyncTimeMicros, mVSyncMonitor.getVSyncPeriodInMicroseconds());
        }
      }
    }
 void requestUpdate() {
   mVSyncMonitor.requestUpdate();
 }
 void setVSyncListener(VSyncManager.Listener listener) {
   mVSyncListener = listener;
   if (mVSyncListener != null) mVSyncMonitor.requestUpdate();
 }
 @Override
 public void registerVSyncListener(VSyncManager.Listener listener) {
   if (!mVSyncNotificationEnabled) mVSyncMonitor.requestUpdate();
   mCurrentVSyncListeners.addObserver(listener);
   mVSyncNotificationEnabled = true;
 }