From 7e52caf6db5feef2b847cfaa3d13690257122c3a Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Tue, 6 Mar 2012 15:57:06 -0800 Subject: [PATCH] Don't draw layers in buildLayer() Creating the layer, if necessary, takes the bulk of the time - just do the creation, and schedule a deferred update Change-Id: I21399ebd5d2929a4f242ec1c08e3f97fed1ef58a --- core/java/android/view/HardwareLayer.java | 2 +- core/java/android/view/TextureView.java | 2 +- core/java/android/view/View.java | 35 ++++------------------- 3 files changed, 7 insertions(+), 32 deletions(-) diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java index 49450bd82bb84..a97167b6ff74b 100644 --- a/core/java/android/view/HardwareLayer.java +++ b/core/java/android/view/HardwareLayer.java @@ -167,7 +167,7 @@ abstract class HardwareLayer { /** * Specifies the display list to use to refresh the layer. - * + * * @param displayList The display list containing the drawing commands to * execute in this layer * @param dirtyRect The dirty region of the layer that needs to be redrawn diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java index c1e9946db8c9e..fc02cc1fc7f72 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -315,7 +315,7 @@ public class TextureView extends View { } @Override - HardwareLayer getHardwareLayer(boolean immediateRefresh) { + HardwareLayer getHardwareLayer() { if (mLayer == null) { if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { return null; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index ecfca74a0b1f7..aea7c302bfdf7 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -10220,7 +10220,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled() && mAttachInfo.mHardwareRenderer.validate()) { - getHardwareLayer(true); + getHardwareLayer(); } break; case LAYER_TYPE_SOFTWARE: @@ -10242,7 +10242,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal * * @return A HardwareLayer ready to render, or null if an error occurred. */ - HardwareLayer getHardwareLayer(boolean immediateRefresh) { + HardwareLayer getHardwareLayer() { if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null || !mAttachInfo.mHardwareRenderer.isEnabled()) { return null; @@ -10272,33 +10272,8 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal return null; } - if (!immediateRefresh) { - mHardwareLayer.redraw(getDisplayList(), mLocalDirtyRect); - mLocalDirtyRect.setEmpty(); - } else { - HardwareCanvas currentCanvas = mAttachInfo.mHardwareCanvas; - final HardwareCanvas canvas = mHardwareLayer.start(currentCanvas); - - // Make sure all the GPU resources have been properly allocated - if (canvas == null) { - mHardwareLayer.end(currentCanvas); - return null; - } - - mAttachInfo.mHardwareCanvas = canvas; - try { - canvas.setViewport(width, height); - canvas.onPreDraw(mLocalDirtyRect); - mLocalDirtyRect.setEmpty(); - - canvas.drawDisplayList(getDisplayList(), mRight - mLeft, mBottom - mTop, null, - DisplayList.FLAG_CLIP_CHILDREN); - } finally { - canvas.onPostDraw(); - mHardwareLayer.end(currentCanvas); - mAttachInfo.mHardwareCanvas = currentCanvas; - } - } + mHardwareLayer.redraw(getDisplayList(), mLocalDirtyRect); + mLocalDirtyRect.setEmpty(); } return mHardwareLayer; @@ -11265,7 +11240,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (hasNoCache) { boolean layerRendered = false; if (layerType == LAYER_TYPE_HARDWARE) { - final HardwareLayer layer = getHardwareLayer(false); + final HardwareLayer layer = getHardwareLayer(); if (layer != null && layer.isValid()) { mLayerPaint.setAlpha((int) (alpha * 255)); ((HardwareCanvas) canvas).drawHardwareLayer(layer, 0, 0, mLayerPaint);