5

私は Android の初心者で、ゲームを開発しています。私がmemory exceptions作成するビットマップのサイズはせいぜい 200 kb であるため、これは驚くべきことです。BitmapFactory.decodeResource()新しい を作成するたびに呼び出しますsprite。私のアプリケーションはゾンビ ディフェンス ゲームなので、スプライトを頻繁に作成することが予想されます。

スプライトを作成するたびに、decode リソースを呼び出してビットマップを生成します。私の質問は、各アクティビティの開始時にのみデコード リソースを呼び出し、パッケージ レベルでビットマップを参照する場合、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);
    
  • 他の最適化が実際にうまくいかない場合の便利なトリッキーな解決策の 1 つは、OutOfMemoryException をキャッチして、品質を最大に下げることができるということです。つまり、inSampleSize を 16 に設定します。画像の品質は低下しますが、少なくともアプリケーションがクラッシュするのを防ぎます。ビットマップに巨大な MP イメージをロードする必要があるアプリの 1 つでこれを行いました。
于 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 に答える