我对 Android 很陌生,一直在开发游戏。时不时地有用户报告memory exceptions
,我感到惊讶,因为我创建的位图大小最多为 200 kb。每当我BitmapFactory.decodeResource()
创建一个新的sprite
. 由于我的应用程序是一个僵尸防御游戏,你可以期待我经常创建精灵。
每次创建精灵时,我都会调用解码资源来生成位图。我的问题是,如果我只在每个活动开始时调用解码资源,并在包级别引用位图,这会减少放置在 VM 预算上的内存量吗?
我对 Android 很陌生,一直在开发游戏。时不时地有用户报告memory exceptions
,我感到惊讶,因为我创建的位图大小最多为 200 kb。每当我BitmapFactory.decodeResource()
创建一个新的sprite
. 由于我的应用程序是一个僵尸防御游戏,你可以期待我经常创建精灵。
每次创建精灵时,我都会调用解码资源来生成位图。我的问题是,如果我只在每个活动开始时调用解码资源,并在包级别引用位图,这会减少放置在 VM 预算上的内存量吗?
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);
我的片段从资源安全中获取图像。您可以设置自己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;
}
}