2013-05-06 89 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