Skip to content

Commit

Permalink
bootanimation: performance enhancements
Browse files Browse the repository at this point in the history
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
  • Loading branch information
turl committed Jun 13, 2012
1 parent 3704f5b commit 8507488
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 4 deletions.
12 changes: 12 additions & 0 deletions cmds/bootanimation/Android.mk
Expand Up @@ -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


Expand Down
46 changes: 42 additions & 4 deletions cmds/bootanimation/BootAnimation.cpp
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 8507488

Please sign in to comment.