【问题标题】:Memory vs Performance, which would be best?内存与性能,哪个最好?
【发布时间】:2013-05-06 11:26:56
【问题描述】:

我需要拍摄一张图像,对其进行缩放、遮罩、添加背景以防其中一些是透明的,然后添加叠加图像。为此,我编写了以下内容:

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 位图会更改),或者甚至作为可绘制的位图从中创建位图?

【问题讨论】:

    标签: java android performance memory bitmap


    【解决方案1】:

    切勿在显示它的活动/片段之外保存可绘制对象。
    它很容易造成内存泄漏:drawable 保留对其活动的引用,因此垃圾收集器无法销毁它,即使它已被销毁并重新创建。
    请改用位图。

    【讨论】:

    • 啊,好吧,保存位图是否可以安全使用,而不是一遍又一遍地重新创建它?
    • 如果您要多次重复使用同一个位图,强烈建议不要每次都重新创建它。避免在 getView() 等对性能至关重要的方法中创建位图(或任何代价高昂的对象)尤为重要。
    • 这就是我一直在寻找的答案。非常感谢:-)
    • 不客气。不要犹豫,不时在您的项目上运行 Android Lint,它会为良好的编码实践和可能的优化提供非常有用的建议。我认为它还包括对位图的检查。
    猜你喜欢
    • 2015-01-19
    • 2016-10-08
    • 2012-10-02
    • 2011-12-02
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2015-01-09
    • 2010-11-01
    相关资源
    最近更新 更多