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:
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user