diff options
author | Emilio López <turl@tuxfamily.org> | 2012-06-10 17:39:10 +0000 |
---|---|---|
committer | Emilio López <turl@tuxfamily.org> | 2012-06-13 03:16:53 +0000 |
commit | 850748847a20d2c190bcd392a19c7236311fe462 (patch) | |
tree | aa5d659817d33648abf751adaa185c49f4bcd5bf /cmds/bootanimation | |
parent | 3704f5b7b435c0ca3ea12fb31cb44b0986e85da9 (diff) | |
download | frameworks_base-850748847a20d2c190bcd392a19c7236311fe462.zip frameworks_base-850748847a20d2c190bcd392a19c7236311fe462.tar.gz frameworks_base-850748847a20d2c190bcd392a19c7236311fe462.tar.bz2 |
bootanimation: performance enhancements
This patch implements two simple performance enhancements, which
might benefit devices. They are completely opt-in by setting
the following variables.
* TARGET_BOOTANIMATION_PRELOAD: will preload the bootanimation
zip to memory; this is handy on devices where the storage
might be slow. By preloading it, we get quick access to the
zip file, and the animation doesn't stutter.
* TARGET_BOOTANIMATION_TEXTURE_CACHE: allows maintainers to
force texture cache on/off.
Also fixes the sign warnings related to int / size_t comparison
Change-Id: Ie92d1b0aa90b43ba39c368a2a33657a60c3a64b5
Diffstat (limited to 'cmds/bootanimation')
-rw-r--r-- | cmds/bootanimation/Android.mk | 12 | ||||
-rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 46 |
2 files changed, 54 insertions, 4 deletions
diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk index 7d39912..7f1857d 100644 --- a/cmds/bootanimation/Android.mk +++ b/cmds/bootanimation/Android.mk @@ -20,6 +20,18 @@ LOCAL_SHARED_LIBRARIES := \ LOCAL_C_INCLUDES := \ $(call include-path-for, corecg graphics) +ifeq ($(TARGET_BOOTANIMATION_PRELOAD),true) + LOCAL_CFLAGS += -DPRELOAD_BOOTANIMATION +endif + +ifeq ($(TARGET_BOOTANIMATION_TEXTURE_CACHE),true) + LOCAL_CFLAGS += -DNO_TEXTURE_CACHE=0 +endif + +ifeq ($(TARGET_BOOTANIMATION_TEXTURE_CACHE),false) + LOCAL_CFLAGS += -DNO_TEXTURE_CACHE=1 +endif + LOCAL_MODULE:= bootanimation diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index d95184a..2f06ad5 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -281,6 +281,38 @@ status_t BootAnimation::readyToRun() { mAndroidAnimation = false; } + +#ifdef PRELOAD_BOOTANIMATION + // Preload the bootanimation zip on memory, so we don't stutter + // when showing the animation + FILE* fd; + if (encryptedAnimation && access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0) + fd = fopen(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, "r"); + else if (access(USER_BOOTANIMATION_FILE, R_OK) == 0) + fd = fopen(USER_BOOTANIMATION_FILE, "r"); + else if (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) + fd = fopen(SYSTEM_BOOTANIMATION_FILE, "r"); + else + return NO_ERROR; + + if (fd != NULL) { + // We could use readahead.. + // ... if bionic supported it :( + //readahead(fd, 0, INT_MAX); + void *crappyBuffer = malloc(2*1024*1024); + if (crappyBuffer != NULL) { + // Read all the zip + while (!feof(fd)) + fread(crappyBuffer, 1024, 2*1024, fd); + + free(crappyBuffer); + } else { + LOGW("Unable to allocate memory to preload the animation"); + } + fclose(fd); + } +#endif + return NO_ERROR; } @@ -420,7 +452,7 @@ bool BootAnimation::movie() const String8 path(entryName.getPathDir()); const String8 leaf(entryName.getPathLeaf()); if (leaf.size() > 0) { - for (int j=0 ; j<pcount ; j++) { + for (size_t j=0 ; j<pcount ; j++) { if (path == animation.parts[j].path) { int method; // supports only stored png files @@ -468,16 +500,22 @@ bool BootAnimation::movie() Region clearReg(Rect(mWidth, mHeight)); clearReg.subtractSelf(Rect(xc, yc, xc+animation.width, yc+animation.height)); - for (int i=0 ; i<pcount && !exitPending() ; i++) { + for (size_t i=0 ; i<pcount && !exitPending() ; i++) { const Animation::Part& part(animation.parts[i]); const size_t fcount = part.frames.size(); + + // can be 1, 0, or not set + #ifdef NO_TEXTURE_CACHE + const int noTextureCache = NO_TEXTURE_CACHE; + #else const int noTextureCache = ((animation.width * animation.height * fcount) > 48 * 1024 * 1024) ? 1 : 0; + #endif glBindTexture(GL_TEXTURE_2D, 0); for (int r=0 ; !part.count || r<part.count ; r++) { - for (int j=0 ; j<fcount && !exitPending(); j++) { + for (size_t j=0 ; j<fcount && !exitPending(); j++) { const Animation::Frame& frame(part.frames[j]); if (r > 0 && !noTextureCache) { @@ -523,7 +561,7 @@ bool BootAnimation::movie() // free the textures for this part if (part.count != 1 && !noTextureCache) { - for (int j=0 ; j<fcount ; j++) { + for (size_t j=0 ; j<fcount ; j++) { const Animation::Frame& frame(part.frames[j]); glDeleteTextures(1, &frame.tid); } |