Android:内存不足/ decodeResource如何添加到VM预算?

时间:2012-08-14 00:31:42

标签: java android out-of-memory

我对Android很新,并且一直在开发游戏。每隔一段时间我都有用户报告memory exceptions,我觉得很惊讶,因为我创建的位图大小最多为200 kb。每当我创建一个新的BitmapFactory.decodeResource()时,我都会调用sprite。由于我的应用程序是一个僵尸防御游戏,你可以期待我经常创建精灵。

每次创建精灵时,我都会调用decode资源来生成一个位图。我的问题是,如果我只在每个活动开始时调用解码资源,并在包级别引用位图,这是否会减少VM预算上的内存量?

2 个答案:

答案 0 :(得分:18)

  • 当您从图像资源(如png)解码位图时,它 更多地取决于图像的尺寸,而不是KB的大小。
  • 尝试在不影响输出的情况下缩小原始图像的尺寸。
  • 尝试重用位图而不是解码它们。
  • 使用BitmapFactory.Options()对象探索更多选项,例如增加inSampleSize可以减少图像所需的内存量。 例如
    BitmapFactory.Options o=new BitmapFactory.Options();
    o.inSampleSize = 4;
    o.inDither=false;                     //Disable Dithering mode
    o.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
    myBitMap=BitmapFactory.decodeResource(getResources(),ID, o);
    
  • 一个有用的棘手解决方案,如果没有其他优化确实适合你,你可以捕获OutOfMemoryException,然后可以将质量降低到最大...即将inSampleSize设置为16.这将降低图像的质量但至少会保存你的应用程序不会崩溃,我在我的应用程序中做了这个,我需要在位图中加载巨大的MP图像。

答案 1 :(得分:0)

我从资源安全获取图片的片段。您可以将自己的sampleSize设置为图像质量的阈值(较大的sampleSize是较低的图像质量)。

public static Bitmap loadBitmapSafety(int resDrId,  Context context){
    return loadBitmapSafety(resDrId, 1, context);
}

private static Bitmap loadBitmapSafety(int resDrId, int sampleSize, Context context){
    BitmapFactory.Options ops = new BitmapFactory.Options();
    ops.inSampleSize = sampleSize;

    try {
        return BitmapFactory.decodeResource(context.getResources(), resDrId, ops);

    } catch (OutOfMemoryError e) {
        if (sampleSize == 4)
            return null;
        return loadBitmapSafety(resDrId, sampleSize +1, context);

    } catch (Exception e){
        return null;
    }
}