From e66554d4be58ce548085487c031cf4d1eb9f76ae Mon Sep 17 00:00:00 2001 From: Chenjie Luo Date: Wed, 20 Jan 2016 13:25:11 -0800 Subject: [PATCH] Fix bug in AssetAtlas packing loop There is a bug in AssetAtlasService that it always choose the MAX_SIZE as height. The for loop of height calculation starts from MAX_SIZE and breaks when it finds a working texture. This means the height loop will always break for the initial value. Reording the loop optimize the algorithm to find a smaller atlas texture. The MIN_SIZE is also changed to 512 for fewer assets case. Bug: 26429912 Change-Id: Ic0b2396e9697c417a24f81ec792f8a8af53915ad --- .../com/android/server/AssetAtlasService.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/AssetAtlasService.java b/services/core/java/com/android/server/AssetAtlasService.java index 4569daee029eb..0b9742c31eb8b 100644 --- a/services/core/java/com/android/server/AssetAtlasService.java +++ b/services/core/java/com/android/server/AssetAtlasService.java @@ -79,7 +79,7 @@ public class AssetAtlasService extends IAssetAtlas.Stub { private static final boolean DEBUG_ATLAS_TEXTURE = false; // Minimum size in pixels to consider for the resulting texture - private static final int MIN_SIZE = 768; + private static final int MIN_SIZE = 512; // Maximum size in pixels to consider for the resulting texture private static final int MAX_SIZE = 2048; // Increment in number of pixels between size variants when looking @@ -664,22 +664,32 @@ public class AssetAtlasService extends IAssetAtlas.Stub { if (DEBUG_ATLAS) Log.d(LOG_TAG, "Running " + Thread.currentThread().getName()); Atlas.Entry entry = new Atlas.Entry(); - for (Atlas.Type type : Atlas.Type.values()) { - for (int width = mEnd; width > mStart; width -= mStep) { - for (int height = MAX_SIZE; height > MIN_SIZE; height -= STEP) { - // If the atlas is not big enough, skip it - if (width * height <= mThreshold) continue; + for (int width = mEnd; width > mStart; width -= mStep) { + for (int height = MAX_SIZE; height > MIN_SIZE; height -= STEP) { + // If the atlas is not big enough, skip it + if (width * height <= mThreshold) continue; + + boolean packSuccess = false; + + for (Atlas.Type type : Atlas.Type.values()) { final int count = packBitmaps(type, width, height, entry); if (count > 0) { mResults.add(new WorkerResult(type, width, height, count)); - // If we were able to pack everything let's stop here - // Increasing the height further won't make things better if (count == mBitmaps.size()) { + // If we were able to pack everything let's stop here + // Changing the type further won't make things better + packSuccess = true; break; } } } + + // If we were not able to pack everything let's stop here + // Decreasing the height further won't make things better + if (!packSuccess) { + break; + } } }