2013-05-06 45 views
0

我需要拍攝圖像,對其進行縮放,遮罩,添加背景以防其中一些透明,然後添加疊加圖像。要做到這一點,我寫了以下內容:內存vs性能,哪個最好?

Canvas canvas = new Canvas(); 
Bitmap mainImage = Bitmap.createScaledBitmap(((BitmapDrawable)d).getBitmap(), iconSize, iconSize, false); 
Bitmap result = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888); 

canvas.setBitmap(result); 
Paint paint = new Paint(); 
paint.setFilterBitmap(false); 

Bitmap mask = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.res, context.mask_bg) 
        , iconSize, iconSize, false); 
         canvas.drawBitmap(mask, 0, 0, paint); 
canvas.drawBitmap(mainImage, 0, 0, paint); 

mask = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.res, context.mask) 
        , iconSize, iconSize, false); 
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 
canvas.drawBitmap(mask, 0, 0, paint); 

mask = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.res, context.mask_frame) 
        , iconSize, iconSize, false); 
paint.setXfermode(null); 
canvas.drawBitmap(mask, 0, 0, paint); 

現在這個操作將會發生在我的應用程序中。我的應用程序總是有一個服務正在運行(這是本例中的上下文)。對於圖像,我不太瞭解性能,我知道它們在空間中的實際尺寸是它們的4倍,但這對我一遍又一遍地重現相同的對象似乎是一種浪費。此外,我的應用程序的主要需求是性能超過規模。

所以我想知道是否最好保持每次在服務中生成的位圖,以便它們只創建一次(只有mainImage位圖每次都會更改),或者甚至作爲drawable從該位置創建位圖?

回答

1

永遠不要在顯示活動/片段的地方保存繪圖。
它可以非常容易地創建內存泄漏:drawable保留對其活動的引用,所以垃圾收集器不能銷燬它,即使它已被銷燬並重新創建。
改爲使用位圖。

+0

好吧,那麼保存的位圖安全可以使用,而不是一遍又一遍地重新創建嗎? – crazyfool 2013-05-06 11:57:35

+1

如果您將多次重複使用相同的位圖,強烈建議不要每次都重新創建它。避免在諸如getView()等對性能至關重要的方法中創建位圖(或任何昂貴的對象)尤爲重要。 – Teovald 2013-05-06 12:25:48

+0

這就是我正在尋找的答案。很多appreaciated :-) – crazyfool 2013-05-06 12:59:07