Close Transactions explicitly

Ensure one-shot, scheduled Transactions are closed after application.
While individual Transaction instances aren't all that heavy, this
avoids unnecessary GC pressure and churn.

Bug: 216159702
Test: atest WmTests SystemUITests FrameworksCoreTests
Change-Id: Iec053dd8163fb9b300fd1e9eb9f1472a0d0dd782
This commit is contained in:
Jared Duke
2022-03-01 11:39:52 -08:00
parent aa0ee6502b
commit 0a682bf137
3 changed files with 24 additions and 13 deletions

View File

@@ -98,6 +98,13 @@ public class InsetsSourceConsumer {
*/
private boolean mIsAnimationPending;
/**
* @param type The {@link InternalInsetsType} of the consumed insets.
* @param state The current {@link InsetsState} of the consumed insets.
* @param transactionSupplier The source of new {@link Transaction} instances. The supplier
* must provide *new* instances, which will be explicitly closed by this class.
* @param controller The {@link InsetsController} to use for insets interaction.
*/
public InsetsSourceConsumer(@InternalInsetsType int type, InsetsState state,
Supplier<Transaction> transactionSupplier, InsetsController controller) {
mType = type;
@@ -390,16 +397,17 @@ public class InsetsSourceConsumer {
return;
}
final Transaction t = mTransactionSupplier.get();
if (DEBUG) Log.d(TAG, "applyRequestedVisibilityToControl: " + mRequestedVisible);
if (mRequestedVisible) {
t.show(mSourceControl.getLeash());
} else {
t.hide(mSourceControl.getLeash());
try (Transaction t = mTransactionSupplier.get()) {
if (DEBUG) Log.d(TAG, "applyRequestedVisibilityToControl: " + mRequestedVisible);
if (mRequestedVisible) {
t.show(mSourceControl.getLeash());
} else {
t.hide(mSourceControl.getLeash());
}
// Ensure the alpha value is aligned with the actual requested visibility.
t.setAlpha(mSourceControl.getLeash(), mRequestedVisible ? 1 : 0);
t.apply();
}
// Ensure the alpha value is aligned with the actual requested visibility.
t.setAlpha(mSourceControl.getLeash(), mRequestedVisible ? 1 : 0);
t.apply();
onPerceptible(mRequestedVisible);
}

View File

@@ -65,10 +65,12 @@ public class SyncRtSurfaceTransactionApplier {
applyParams(t, params);
mTargetViewRootImpl.registerRtFrameCallback(frame -> {
if (mTargetSc == null || !mTargetSc.isValid()) {
return;
if (mTargetSc != null && mTargetSc.isValid()) {
applyTransaction(t, frame);
}
applyTransaction(t, frame);
// The transaction was either dropped, successfully applied, or merged with a future
// transaction, so we can safely release its resources.
t.close();
});
// Make sure a frame gets scheduled.

View File

@@ -4175,7 +4175,7 @@ public final class ViewRootImpl implements ViewParent,
+ " didProduceBuffer=" + didProduceBuffer);
}
Transaction tmpTransaction = new Transaction();
final Transaction tmpTransaction = new Transaction();
tmpTransaction.merge(mRtBLASTSyncTransaction);
// If frame wasn't drawn, clear out the next transaction so it doesn't affect the next
@@ -4206,6 +4206,7 @@ public final class ViewRootImpl implements ViewParent,
blastSyncConsumer.accept(mSurfaceChangedTransaction);
}
}
tmpTransaction.close();
if (reportNextDraw) {
pendingDrawFinished();