diff options
| author | 2022-11-28 23:10:14 +0800 | |
|---|---|---|
| committer | 2022-11-29 15:11:06 +0800 | |
| commit | 7bdc13adf6723e23573435d35482dc72e76954dd (patch) | |
| tree | 3f0f23133b666143e84e9e8af564b1fa790402e4 | |
| parent | 5a31efbff4af7b34d9a29a681ebea08dd6ead189 (diff) | |
Reduce surface placement of sync group
1. setReady may be called multiples times from
WindowOrganizerController#startTransition and
DisplayContent#executeAppTransition. If the state is the same,
there is no need to request traversal.
2. When collecting a change if the group is not ready, the
visibility, config, lifecycle events and setReady=true will
trigger traversal as well.
Bug: 260059642
Test: atest SyncEngineTests
Test: Start next activity and finish current activity.
The slice of trace "finishActivity" should not contain
"performSurfacePlacement".
Change-Id: I8cc0c70bb8c2da504cc53379ea107c13d8bdd197
| -rw-r--r-- | services/core/java/com/android/server/wm/BLASTSyncEngine.java | 7 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java | 18 |
2 files changed, 15 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/wm/BLASTSyncEngine.java b/services/core/java/com/android/server/wm/BLASTSyncEngine.java index d3452277a29f..cd26e2eb9c53 100644 --- a/services/core/java/com/android/server/wm/BLASTSyncEngine.java +++ b/services/core/java/com/android/server/wm/BLASTSyncEngine.java @@ -226,6 +226,9 @@ class BLASTSyncEngine { } private void setReady(boolean ready) { + if (mReady == ready) { + return; + } ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "SyncGroup %d: Set ready", mSyncId); mReady = ready; if (!ready) return; @@ -239,7 +242,9 @@ class BLASTSyncEngine { ProtoLog.v(WM_DEBUG_SYNC_ENGINE, "SyncGroup %d: Adding to group: %s", mSyncId, wc); wc.setSyncGroup(this); wc.prepareSync(); - mWm.mWindowPlacerLocked.requestTraversal(); + if (mReady) { + mWm.mWindowPlacerLocked.requestTraversal(); + } } void onCancelSync(WindowContainer wc) { diff --git a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java index d3aa073c84d8..df7b3cdebe28 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java @@ -74,15 +74,15 @@ public class SyncEngineTests extends WindowTestsBase { int id = startSyncSet(bse, listener); bse.addToSyncSet(id, mockWC); - // Make sure a traversal is requested - verify(mWm.mWindowPlacerLocked, times(1)).requestTraversal(); + // The traversal is not requested because ready is not set. + verify(mWm.mWindowPlacerLocked, times(0)).requestTraversal(); bse.onSurfacePlacement(); verify(listener, times(0)).onTransactionReady(anyInt(), any()); bse.setReady(id); // Make sure a traversal is requested - verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal(); + verify(mWm.mWindowPlacerLocked).requestTraversal(); bse.onSurfacePlacement(); verify(listener, times(1)).onTransactionReady(eq(id), notNull()); @@ -103,14 +103,14 @@ public class SyncEngineTests extends WindowTestsBase { int id = startSyncSet(bse, listener); bse.addToSyncSet(id, mockWC); bse.setReady(id); - // Make sure traversals requested (one for add and another for setReady) - verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal(); + // Make sure traversals requested. + verify(mWm.mWindowPlacerLocked).requestTraversal(); bse.onSurfacePlacement(); verify(listener, times(0)).onTransactionReady(anyInt(), any()); mockWC.onSyncFinishedDrawing(); - // Make sure a (third) traversal is requested. - verify(mWm.mWindowPlacerLocked, times(3)).requestTraversal(); + // Make sure the second traversal is requested. + verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal(); bse.onSurfacePlacement(); verify(listener, times(1)).onTransactionReady(eq(id), notNull()); } @@ -127,8 +127,8 @@ public class SyncEngineTests extends WindowTestsBase { int id = startSyncSet(bse, listener); bse.addToSyncSet(id, mockWC); bse.setReady(id); - // Make sure traversals requested (one for add and another for setReady) - verify(mWm.mWindowPlacerLocked, times(2)).requestTraversal(); + // Make sure traversals requested. + verify(mWm.mWindowPlacerLocked).requestTraversal(); bse.onSurfacePlacement(); verify(listener, times(0)).onTransactionReady(anyInt(), any()); |