diff options
author | Likai Ding <likaid@codeaurora.org> | 2016-06-01 10:31:45 +0800 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-09-26 04:54:49 -0700 |
commit | b750059243b8b484a744b7715fbba55e6f968349 (patch) | |
tree | 8ba2b870603692a0c746cfd740a54932b8085b16 | |
parent | 0f34582709227dd5c2e0d26d59bc6dd8e6f4f6a2 (diff) | |
download | android_packages_apps_Gallery2-b750059243b8b484a744b7715fbba55e6f968349.tar.gz android_packages_apps_Gallery2-b750059243b8b484a744b7715fbba55e6f968349.tar.bz2 android_packages_apps_Gallery2-b750059243b8b484a744b7715fbba55e6f968349.zip |
Gallery: faster texture upload
TileTexture.Uploader uses a fixed time slot (4ms) to upload tiles.
However, typical GL idle time is much longer than that. To better
utilize it, a third parameter is added to onGLIdle method to indicate
the due time. This can cut ~170ms on certain devices.
CRs-Fixed: 1024519
Change-Id: I8347b87f85815a4deaf10eb10f234a56b047681e
6 files changed, 24 insertions, 16 deletions
diff --git a/src/com/android/gallery3d/glrenderer/TextureUploader.java b/src/com/android/gallery3d/glrenderer/TextureUploader.java index f17ab845c..bc670eca4 100644 --- a/src/com/android/gallery3d/glrenderer/TextureUploader.java +++ b/src/com/android/gallery3d/glrenderer/TextureUploader.java @@ -92,7 +92,7 @@ public class TextureUploader implements OnGLIdleListener { } @Override - public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { + public boolean onGLIdle(GLCanvas canvas, boolean renderRequested, long dueTime) { int uploadQuota = QUOTA_PER_FRAME; uploadQuota = upload(canvas, mFgTextures, uploadQuota, false); if (uploadQuota < QUOTA_PER_FRAME) mGLRoot.requestRender(); diff --git a/src/com/android/gallery3d/glrenderer/TiledTexture.java b/src/com/android/gallery3d/glrenderer/TiledTexture.java index 78cb2f2de..f33a52c97 100644 --- a/src/com/android/gallery3d/glrenderer/TiledTexture.java +++ b/src/com/android/gallery3d/glrenderer/TiledTexture.java @@ -24,7 +24,6 @@ import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; -import android.os.SystemClock; import com.android.gallery3d.ui.GLRoot; import com.android.gallery3d.ui.GLRoot.OnGLIdleListener; @@ -42,10 +41,6 @@ public class TiledTexture implements Texture { private static final int TILE_SIZE = CONTENT_SIZE + 2 * BORDER_SIZE; private static final int INIT_CAPACITY = 8; - // We are targeting at 60fps, so we have 16ms for each frame. - // In this 16ms, we use about 4~8 ms to upload tiles. - private static final long UPLOAD_TILE_LIMIT = 4; // ms - private static Tile sFreeTileHead = null; private static final Object sFreeTileLock = new Object(); @@ -88,18 +83,20 @@ public class TiledTexture implements Texture { } @Override - public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { + public boolean onGLIdle(GLCanvas canvas, boolean renderRequested, long dueTime) { ArrayDeque<TiledTexture> deque = mTextures; synchronized (this) { - long now = SystemClock.uptimeMillis(); - long dueTime = now + UPLOAD_TILE_LIMIT; - while (now < dueTime && !deque.isEmpty()) { + long now = System.nanoTime(); + long uploadTime = 0; + while (now + uploadTime < dueTime && !deque.isEmpty()) { TiledTexture t = deque.peekFirst(); if (t.uploadNextTile(canvas)) { deque.removeFirst(); mGlRoot.requestRender(); } - now = SystemClock.uptimeMillis(); + long t1 = System.nanoTime(); + uploadTime = t1 - now; + now = t1; } mIsQueued = !mTextures.isEmpty(); diff --git a/src/com/android/gallery3d/ui/GLRoot.java b/src/com/android/gallery3d/ui/GLRoot.java index 33a82eaf7..caa36c334 100644 --- a/src/com/android/gallery3d/ui/GLRoot.java +++ b/src/com/android/gallery3d/ui/GLRoot.java @@ -28,7 +28,7 @@ public interface GLRoot { // Mainly used for uploading textures. public static interface OnGLIdleListener { public boolean onGLIdle( - GLCanvas canvas, boolean renderRequested); + GLCanvas canvas, boolean renderRequested, long dueTime); } public void addOnGLIdleListener(OnGLIdleListener listener); diff --git a/src/com/android/gallery3d/ui/GLRootView.java b/src/com/android/gallery3d/ui/GLRootView.java index dc898d83d..911ca4025 100644 --- a/src/com/android/gallery3d/ui/GLRootView.java +++ b/src/com/android/gallery3d/ui/GLRootView.java @@ -78,6 +78,8 @@ public class GLRootView extends GLSurfaceView private static final int FLAG_INITIALIZED = 1; private static final int FLAG_NEED_LAYOUT = 2; + private static final long FRAME_INTERVAL = 16000000; + private GL11 mGL; private GLCanvas mCanvas; private GLView mContentView; @@ -111,6 +113,8 @@ public class GLRootView extends GLSurfaceView private boolean mInDownState = false; private boolean mFirstDraw = true; + private long mDueTime; + public GLRootView(Context context) { this(context, null); } @@ -339,6 +343,7 @@ public class GLRootView extends GLSurfaceView @Override public void onDrawFrame(GL10 gl) { + mDueTime = System.nanoTime() + FRAME_INTERVAL; AnimationTime.update(); long t0; if (DEBUG_PROFILE_SLOW_ONLY) { @@ -499,9 +504,15 @@ public class GLRootView extends GLSurfaceView listener = mIdleListeners.removeFirst(); } mRenderLock.lock(); - boolean keepInQueue; + boolean keepInQueue = false; try { - keepInQueue = listener.onGLIdle(mCanvas, mRenderRequested); + if (mCanvas != null) { + long t = System.nanoTime(); + if (mDueTime < t) { + mDueTime = t + FRAME_INTERVAL / 2; + } + keepInQueue = listener.onGLIdle(mCanvas, mRenderRequested, mDueTime); + } } finally { mRenderLock.unlock(); } diff --git a/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java b/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java index ce672f211..74be72255 100644 --- a/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java +++ b/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java @@ -47,7 +47,7 @@ public class PreparePageFadeoutTexture implements OnGLIdleListener { } @Override - public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { + public boolean onGLIdle(GLCanvas canvas, boolean renderRequested, long dueTime) { if (!mCancelled) { try { canvas.beginRenderTarget(mTexture); diff --git a/src/com/android/gallery3d/ui/TileImageView.java b/src/com/android/gallery3d/ui/TileImageView.java index 2b978d1bf..16e2fc129 100644 --- a/src/com/android/gallery3d/ui/TileImageView.java +++ b/src/com/android/gallery3d/ui/TileImageView.java @@ -559,7 +559,7 @@ public class TileImageView extends GLView { AtomicBoolean mActive = new AtomicBoolean(false); @Override - public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { + public boolean onGLIdle(GLCanvas canvas, boolean renderRequested, long dueTime) { // Skips uploading if there is a pending rendering request. // Returns true to keep uploading in next rendering loop. if (renderRequested) return true; |