From 4b505376cb1d77de39d12f4f8bc88e111fbbdc5f Mon Sep 17 00:00:00 2001 From: caiqinl Date: Fri, 24 Jun 2016 13:37:46 +0800 Subject: Fix native memory leak caused by small HWUI path cache creation HWUI calculates the texture size as w*h*bpp. In some cases, the calculated path cache is small, but the actual memory allocated in driver is 4k/8k/16k, much bigger than HWUI calculates. Example: a 5*65 alpha texture, HWUI think it is 5*65*1 = 325 bytes, but driver allocates 8K. An app can allocates up to 32M path textures, which actually consumes 32M*(8*1024/325) = 806M memory. Here we limit the number of path texture in the cache to 256, it should be a pretty generous global limit. Change-Id: I890819b73bb0b7f63e96bc3d9d0ff9469c16838c --- libs/hwui/PathCache.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'libs/hwui/PathCache.cpp') diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp index 3236f6f7c24d..ec86101f4c0b 100644 --- a/libs/hwui/PathCache.cpp +++ b/libs/hwui/PathCache.cpp @@ -138,7 +138,7 @@ static void drawPath(const SkPath *path, const SkPaint* paint, SkBitmap& bitmap, PathCache::PathCache(): mCache(LruCache::kUnlimitedCapacity), - mSize(0), mMaxSize(MB(DEFAULT_PATH_CACHE_SIZE)) { + mSize(0), mMaxSize(MB(DEFAULT_PATH_CACHE_SIZE)), mTexNum(0) { char property[PROPERTY_VALUE_MAX]; if (property_get(PROPERTY_PATH_CACHE_SIZE, property, nullptr) > 0) { INIT_LOGD(" Setting %s cache size to %sMB", name, property); @@ -202,6 +202,7 @@ void PathCache::removeTexture(PathTexture* texture) { "the cache in an inconsistent state", size); } mSize -= size; + mTexNum--; } PATH_LOGD("PathCache::delete name, size, mSize = %d, %d, %d", @@ -228,7 +229,7 @@ void PathCache::purgeCache(uint32_t width, uint32_t height) { } void PathCache::trim() { - while (mSize > mMaxSize) { + while (mSize > mMaxSize || mTexNum > DEFAULT_PATH_TEXTURE_CAP) { mCache.removeOldest(); } } @@ -299,6 +300,7 @@ void PathCache::generateTexture(SkBitmap& bitmap, Texture* texture) { texture->setFilter(GL_LINEAR); texture->setWrap(GL_CLAMP_TO_EDGE); + mTexNum++; } /////////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3-59-g8ed1b