From 63e79f72cd15ef4468a2d2f5358e837be6931789 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 10 May 2023 16:58:27 +0800 Subject: [PATCH] Reduce operations before dispatching transition ready This avoids the latency by logging for TransitionTracer before notifying shell that the transition is ready. Also use calculated info for tracer to avoid overhead such as getChangeFlags may need to traverse the window hierarchy again. Bug: 275508603 Test: Check trace that the start of Transition's "playing" can appear earlier in "onTransactionReady". Change-Id: I2c21d3e4f8bfe18e43c14f84428d13a6758c7b8d --- .../core/java/com/android/server/wm/Transition.java | 12 ++++++++++-- .../java/com/android/server/wm/TransitionTracer.java | 6 ++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index bfd0d96a04abf..5e60e92150a9b 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1473,7 +1473,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { "Calling onTransitionReady: %s", info); mLogger.mSendTimeNs = SystemClock.elapsedRealtimeNanos(); mLogger.mInfo = info; - mController.mTransitionTracer.logSentTransition(this, mTargets, info); mController.getTransitionPlayer().onTransitionReady( mToken, info, transaction, mFinishTransaction); if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) { @@ -1501,13 +1500,17 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { } postCleanupOnFailure(); } - mController.mLoggerHandler.post(mLogger::logOnSend); mOverrideOptions = null; reportStartReasonsToLogger(); // Since we created root-leash but no longer reference it from core, release it now info.releaseAnimSurfaces(); + + mController.mLoggerHandler.post(mLogger::logOnSend); + if (mLogger.mInfo != null) { + mController.mTransitionTracer.logSentTransition(this, mTargets, info); + } } /** @@ -2245,6 +2248,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { info.mReadyMode = change.getMode(); change.setStartAbsBounds(info.mAbsoluteBounds); change.setFlags(info.getChangeFlags(target)); + info.mReadyFlags = change.getFlags(); change.setDisplayId(info.mDisplayId, getDisplayId(target)); final Task task = target.asTask(); @@ -2628,6 +2632,10 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { @TransitionInfo.TransitionMode int mReadyMode; + /** The flags which is set when the transition is ready. */ + @TransitionInfo.ChangeFlags + int mReadyFlags; + ChangeInfo(@NonNull WindowContainer origState) { mContainer = origState; mVisible = origState.isVisibleRequested(); diff --git a/services/core/java/com/android/server/wm/TransitionTracer.java b/services/core/java/com/android/server/wm/TransitionTracer.java index afc14926f63c5..a002fba0877e8 100644 --- a/services/core/java/com/android/server/wm/TransitionTracer.java +++ b/services/core/java/com/android/server/wm/TransitionTracer.java @@ -144,8 +144,6 @@ public class TransitionTracer { final Transition.ChangeInfo target = targets.get(i); - final int mode = target.getTransitMode(target.mContainer); - final int flags = target.getChangeFlags(target.mContainer); final int layerId; if (target.mContainer.mSurfaceControl.isValid()) { layerId = target.mContainer.mSurfaceControl.getLayerId(); @@ -153,8 +151,8 @@ public class TransitionTracer { layerId = -1; } - outputStream.write(com.android.server.wm.shell.Target.MODE, mode); - outputStream.write(com.android.server.wm.shell.Target.FLAGS, flags); + outputStream.write(com.android.server.wm.shell.Target.MODE, target.mReadyMode); + outputStream.write(com.android.server.wm.shell.Target.FLAGS, target.mReadyFlags); outputStream.write(com.android.server.wm.shell.Target.LAYER_ID, layerId); if (mActiveTracingEnabled) {