diff options
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 37 | ||||
| -rw-r--r-- | core/java/android/view/flags/refresh_rate_flags.aconfig | 8 |
2 files changed, 45 insertions, 0 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 9d2ab1fe2085..d91826324853 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -96,6 +96,7 @@ import static android.view.accessibility.Flags.reduceWindowContentChangedEventTh import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER; import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER; import static android.view.flags.Flags.toolkitSetFrameRateReadOnly; +import static android.view.flags.Flags.toolkitMetricsForFrameRateDecision; import android.Manifest; import android.accessibilityservice.AccessibilityService; @@ -372,6 +373,8 @@ public final class ViewRootImpl implements ViewParent, */ private static final int KEEP_CLEAR_AREA_REPORT_RATE_MILLIS = 100; + private static final long NANOS_PER_SEC = 1000000000; + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) static final ThreadLocal<HandlerActionQueue> sRunQueues = new ThreadLocal<HandlerActionQueue>(); @@ -819,6 +822,8 @@ public final class ViewRootImpl implements ViewParent, private boolean mInsetsAnimationRunning; + private long mPreviousFrameDrawnTime = -1; + /** * The resolved pointer icon type requested by this window. * A null value indicates the resolved pointer icon has not yet been calculated. @@ -1048,11 +1053,14 @@ public final class ViewRootImpl implements ViewParent, private boolean mChildBoundingInsetsChanged = false; private String mTag = TAG; + private String mFpsTraceName; private static boolean sToolkitSetFrameRateReadOnlyFlagValue; + private static boolean sToolkitMetricsForFrameRateDecisionFlagValue; static { sToolkitSetFrameRateReadOnlyFlagValue = toolkitSetFrameRateReadOnly(); + sToolkitMetricsForFrameRateDecisionFlagValue = toolkitMetricsForFrameRateDecision(); } public ViewRootImpl(Context context, Display display) { @@ -1293,6 +1301,7 @@ public final class ViewRootImpl implements ViewParent, attrs = mWindowAttributes; setTag(); + mFpsTraceName = "FPS of " + getTitle(); if (DEBUG_KEEP_SCREEN_ON && (mClientWindowLayoutFlags & WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0 @@ -4660,6 +4669,31 @@ public final class ViewRootImpl implements ViewParent, } } + /** + * Called from draw() to collect metrics for frame rate decision. + */ + private void collectFrameRateDecisionMetrics() { + if (!Trace.isEnabled()) { + if (mPreviousFrameDrawnTime > 0) mPreviousFrameDrawnTime = -1; + return; + } + + if (mPreviousFrameDrawnTime < 0) { + mPreviousFrameDrawnTime = mChoreographer.getExpectedPresentationTimeNanos(); + return; + } + + long expectedDrawnTime = mChoreographer.getExpectedPresentationTimeNanos(); + long timeDiff = expectedDrawnTime - mPreviousFrameDrawnTime; + if (timeDiff <= 0) { + return; + } + + long fps = NANOS_PER_SEC / timeDiff; + Trace.setCounter(mFpsTraceName, fps); + mPreviousFrameDrawnTime = expectedDrawnTime; + } + private void reportDrawFinished(@Nullable Transaction t, int seqId) { if (DEBUG_BLAST) { Log.d(mTag, "reportDrawFinished"); @@ -4978,6 +5012,9 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_FPS) { trackFPS(); } + if (sToolkitMetricsForFrameRateDecisionFlagValue) { + collectFrameRateDecisionMetrics(); + } if (!sFirstDrawComplete) { synchronized (sFirstDrawHandlers) { diff --git a/core/java/android/view/flags/refresh_rate_flags.aconfig b/core/java/android/view/flags/refresh_rate_flags.aconfig index a467afe5d06a..0aa516e08697 100644 --- a/core/java/android/view/flags/refresh_rate_flags.aconfig +++ b/core/java/android/view/flags/refresh_rate_flags.aconfig @@ -42,4 +42,12 @@ flag { namespace: "core_graphics" description: "Enable the `setFrameRate` callback" bug: "299946220" +} + +flag { + name: "toolkit_metrics_for_frame_rate_decision" + namespace: "toolkit" + description: "Feature flag for toolkit metrics collecting for frame rate decision" + bug: "301343249" + is_fixed_read_only: true }
\ No newline at end of file |