5

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

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

4

2 回答 2

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 图像。
于 2012-09-12T08:55:47.170 回答
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;
    }
}
于 2015-01-16T00:16:53.833 回答