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
This commit is contained in:
Riddle Hsu
2022-11-28 23:10:14 +08:00
parent 5a31efbff4
commit 7bdc13adf6
2 changed files with 15 additions and 10 deletions

View File

@@ -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) {

View File

@@ -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());