From 850748847a20d2c190bcd392a19c7236311fe462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 10 Jun 2012 17:39:10 +0000 Subject: 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 --- cmds/bootanimation/Android.mk | 12 ++++++++++ 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 48 * 1024 * 1024) ? 1 : 0; + #endif glBindTexture(GL_TEXTURE_2D, 0); for (int r=0 ; !part.count || 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