From ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3c Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Tue, 4 Sep 2012 09:49:35 -0700 Subject: [PATCH] Remove single pass actions from display loop. The WindowAnimator loop over each Display contained actions that only needed to be done one time but were instead done once per loop. Change-Id: Ia916b08cdb7670686e6295dbcef6a5ff27474099 --- .../com/android/server/wm/DimAnimator.java | 7 +++ .../com/android/server/wm/WindowAnimator.java | 53 ++++++++++--------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/services/java/com/android/server/wm/DimAnimator.java b/services/java/com/android/server/wm/DimAnimator.java index afcf339ca6a1c..87a2880ce7406 100644 --- a/services/java/com/android/server/wm/DimAnimator.java +++ b/services/java/com/android/server/wm/DimAnimator.java @@ -212,5 +212,12 @@ class DimAnimator { mDimHeight = dimHeight; mDimTarget = dimTarget; } + + Parameters(Parameters o) { + mDimWinAnimator = o.mDimWinAnimator; + mDimWidth = o.mDimWidth; + mDimHeight = o.mDimHeight; + mDimTarget = o.mDimTarget; + } } } diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index 9eab92c4a979f..f0b514cc02dcc 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -176,7 +176,7 @@ public class WindowAnimator { // Set the new DimAnimator params. DimAnimator.Parameters dimParams = layoutToAnim.mDimParams; if (dimParams == null) { - mDimParams = dimParams; + mDimParams = null; } else { final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator; @@ -187,7 +187,7 @@ public class WindowAnimator { if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null || !existingDimWinAnimator.mSurfaceShown || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) { - mDimParams = dimParams; + mDimParams = new DimAnimator.Parameters(dimParams); } } @@ -559,15 +559,6 @@ public class WindowAnimator { private void performAnimationsLocked(final WinAnimatorList winAnimatorList) { updateWindowsLocked(winAnimatorList); updateWallpaperLocked(winAnimatorList); - - for (int i = mPendingLayoutChanges.size() - 1; i >= 0; i--) { - if ((mPendingLayoutChanges.valueAt(i) - & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { - mPendingActions |= WALLPAPER_ACTION_PENDING; - } - } - - testTokenMayBeDrawnLocked(); } // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */ @@ -576,12 +567,7 @@ public class WindowAnimator { if (!mInitialized) { return; } - for (int i = mWinAnimatorLists.size() - 1; i >= 0; i--) { - animateLocked(mWinAnimatorLists.get(i)); - } - } - private void animateLocked(final WinAnimatorList winAnimatorList) { mPendingLayoutChanges.clear(); mCurrentTime = SystemClock.uptimeMillis(); mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE; @@ -591,25 +577,31 @@ public class WindowAnimator { Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime); } - // Update animations of all applications, including those - // associated with exiting/removed apps + if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( + TAG, ">>> OPEN TRANSACTION animateLocked"); Surface.openTransaction(); - try { updateWindowsAppsAndRotationAnimationsLocked(); - performAnimationsLocked(winAnimatorList); - // THIRD LOOP: Update the surfaces of all windows. + for (int i = mWinAnimatorLists.size() - 1; i >= 0; i--) { + final WinAnimatorList winAnimatorList = mWinAnimatorLists.get(i); + + // Update animations of all applications, including those + // associated with exiting/removed apps + performAnimationsLocked(winAnimatorList); + + final int N = winAnimatorList.size(); + for (int j = 0; j < N; j++) { + winAnimatorList.get(j).prepareSurfaceLocked(true); + } + } + + testTokenMayBeDrawnLocked(); if (mScreenRotationAnimation != null) { mScreenRotationAnimation.updateSurfacesInTransaction(); } - final int N = winAnimatorList.size(); - for (int i = 0; i < N; i++) { - winAnimatorList.get(i).prepareSurfaceLocked(true); - } - if (mDimParams != null) { mDimAnimator.updateParameters(mContext.getResources(), mDimParams, mCurrentTime); } @@ -634,6 +626,15 @@ public class WindowAnimator { Log.wtf(TAG, "Unhandled exception in Window Manager", e); } finally { Surface.closeTransaction(); + if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i( + TAG, "<<< CLOSE TRANSACTION animateLocked"); + } + + for (int i = mPendingLayoutChanges.size() - 1; i >= 0; i--) { + if ((mPendingLayoutChanges.valueAt(i) + & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { + mPendingActions |= WALLPAPER_ACTION_PENDING; + } } if (mBulkUpdateParams != 0 || mPendingLayoutChanges.size() > 0) {