我对Android很新,并且一直在开发游戏。每隔一段时间我都有用户报告memory exceptions
,我觉得很惊讶,因为我创建的位图大小最多为200 kb。每当我创建一个新的BitmapFactory.decodeResource()
时,我都会调用sprite
。由于我的应用程序是一个僵尸防御游戏,你可以期待我经常创建精灵。
每次创建精灵时,我都会调用decode资源来生成一个位图。我的问题是,如果我只在每个活动开始时调用解码资源,并在包级别引用位图,这是否会减少VM预算上的内存量?
答案 0 :(得分:18)
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);
答案 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;
}
}