simplifying code to prevent drawing off-screen
On certain graphics drivers, if you draw to a off-
screen buffer that's not used, it can lead to
poor performance. We were running into this in
launcher; when setChildrenLayersEnabled was called
on a CellLayout, that triggered a re-draw of that
CellLayout's hardware layer, even if that
CellLayout wasn't visible. This CL changes
PagedView so that pages that aren't going to be
rendered are set to View.INVISIBLE, preventing
re-drawing of their hardware layer.
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index b6efcfa..ef36042 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -727,17 +727,16 @@
final int pageCount = getChildCount();
if (pageCount > 0) {
final int screenWidth = getMeasuredWidth();
- int x = (int) getPageAt(0).getRight();
int leftScreen = 0;
int rightScreen = 0;
- while (x <= mScrollX && leftScreen < pageCount - 1) {
+ while (leftScreen < pageCount - 1 &&
+ getPageAt(leftScreen).getRight() <= mScrollX) {
leftScreen++;
- x = getPageAt(leftScreen).getRight();
}
rightScreen = leftScreen;
- while (x < mScrollX + screenWidth && rightScreen < pageCount - 1) {
+ while (rightScreen < pageCount - 1 &&
+ getPageAt(rightScreen + 1).getLeft() < mScrollX + screenWidth) {
rightScreen++;
- x = (int) getPageAt(rightScreen).getRight();
}
range[0] = leftScreen;
range[1] = rightScreen;
@@ -773,8 +772,21 @@
canvas.clipRect(mScrollX, mScrollY, mScrollX + mRight - mLeft,
mScrollY + mBottom - mTop);
- for (int i = rightScreen; i >= leftScreen; i--) {
- drawChild(canvas, getPageAt(i), drawingTime);
+ // On certain graphics drivers, if you draw to a off-screen buffer that's not
+ // used, it can lead to poor performance. We were running into this when
+ // setChildrenLayersEnabled was called on a CellLayout; that triggered a re-draw
+ // of that CellLayout's hardware layer, even if that CellLayout wasn't visible.
+ // As a fix, below we set pages that aren't going to be rendered are to be
+ // View.INVISIBLE, preventing re-drawing of their hardware layer
+ for (int i = getChildCount() - 1; i >= 0; i--) {
+ final View v = getPageAt(i);
+ if (leftScreen <= i && i <= rightScreen &&
+ v.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD) {
+ v.setVisibility(VISIBLE);
+ drawChild(canvas, v, drawingTime);
+ } else {
+ v.setVisibility(INVISIBLE);
+ }
}
canvas.restore();
}
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index d74a2c3..148c1ba 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -1268,32 +1268,6 @@
return (mBackground != null && mBackgroundAlpha > 0.0f && mDrawBackground);
}
- public void scrollTo (int x, int y) {
- super.scrollTo(x, y);
- syncChildrenLayersEnabledOnVisiblePages();
- }
-
- // This method just applies the value mChildrenLayersEnabled to all the pages that
- // will be rendered on the next frame.
- // We do this because calling setChildrenLayersEnabled on a view that's not
- // visible/rendered causes slowdowns on some graphics cards
- private void syncChildrenLayersEnabledOnVisiblePages() {
- if (mChildrenLayersEnabled) {
- getVisiblePages(mTempVisiblePagesRange);
- final int leftScreen = mTempVisiblePagesRange[0];
- final int rightScreen = mTempVisiblePagesRange[1];
- if (leftScreen != -1 && rightScreen != -1) {
- for (int i = leftScreen; i <= rightScreen; i++) {
- ViewGroup page = (ViewGroup) getPageAt(i);
- if (page.getVisibility() == VISIBLE &&
- page.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD) {
- ((ViewGroup)getPageAt(i)).setChildrenLayersEnabled(true);
- }
- }
- }
- }
- }
-
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
@@ -1400,13 +1374,8 @@
if (enableChildrenLayers != mChildrenLayersEnabled) {
mChildrenLayersEnabled = enableChildrenLayers;
- // calling setChildrenLayersEnabled on a view that's not visible/rendered
- // causes slowdowns on some graphics cards, so we only disable it here and leave
- // the enabling to dispatchDraw
- if (!enableChildrenLayers) {
- for (int i = 0; i < getPageCount(); i++) {
- ((ViewGroup)getChildAt(i)).setChildrenLayersEnabled(false);
- }
+ for (int i = 0; i < getPageCount(); i++) {
+ ((ViewGroup)getChildAt(i)).setChildrenLayersEnabled(mChildrenLayersEnabled);
}
}
}
@@ -1731,7 +1700,6 @@
}
}
}
- syncChildrenLayersEnabledOnVisiblePages();
}
});
@@ -1771,7 +1739,6 @@
// Fade the background gradient away
animateBackgroundGradient(0f, true);
}
- syncChildrenLayersEnabledOnVisiblePages();
return anim;
}