2012-04-20 3 views
0

ゲーム用の背景画像といくつかの小さな画像を読み込み、キャンバスに配置して、より小さなオーバーレイされた画像(移動、回転など)キャンバス上で大きな画像を操作してアスペクト比を維持すると、メモリ不足の問題が発生する

アスペクト比(例:5:3)を維持するために、画像をビットマップとして読み込んで自分自身のサイズを変更しようとしました。アイデアは、キャンバスの幅/高さに応じて背景の切り抜き/レターボックス化を行い、小さな画像のサイズの正しい比率を維持することでした。

Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), resourceImg); 
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg2, 0, 0, width, height, matrix, true); 

タブレット/携帯電話に対応するために、私は1600x1000と200kbの背景PNG背景画像を持っています。

しかし、ビットマップが1600x1000x4byte = 6.4MBのRAMとそれ以上のサイズに変更しようとすると、メモリ不足の問題が発生しています。

私はcanvas.setBackgroundResource

SceneCanvas sceneCanvas = (SceneCanvas) findViewById(R.id.the_canvas); 
    sceneCanvas.setBackgroundResource(R.drawable.my_scene_1600x900); 

それが画面いっぱいとアスペクトを維持しない以外これは、うまく機能を使用するように変更することを決めた は(私はこれらの問題が発生した瞬間に、エミュレータを使用しています)比。

アスペクト比を維持する背景を設定する方法はありますか?または、間違ったルートを完全に無くしただけで、ImageViewsを使用してOutOfMemoryの問題を避けるためにキャンバスにレンダリングする必要があります。

答えて

1

ヒープサイズが約20MB程度であれば、大きなビットマップに問題があります(C/C++ /などのネイティブコードに頼らない限り)。

1つのオプションは、あなたのイメージをロードするためにBitmapFactoryを使用することであり、それが読み込まれています。これは、原画像全体をロードしようとすることでメモリを噛んで避けるべきであるとしてOptionsに、あなたは画像をダウンサンプリングするinSampleSizeを指定することができます。 inJustDecodeBoundsオプションさえあります。コードでは、コードに配線されているのではなく、イメージのサイズをチェックできます。

0

Androidのメモリ制限は、デバイスによっては16〜24MBのメモリの間にあるようです。これは、デバイスがより多くのメモリを持っているかどうかにかかわらずです。また、ビットマップで使用されるメモリが制限内に含まれているため、lang.OutOfMemoryError:ビットマップサイズがVMバジェットを超えます。いくつか検索した後、私は見つけることができる3つのオプションがあります。

  • は、1にもOpenGLのテクスチャを使用することができる画像についてはNDK(ネイティブ開発キット)とJNI

  • を使用してネイティブコードからテクスチャをメモリを割り当てメモリは限界に向かってカウントされません。

  • 特定のビットマップオプションを利用してサイズを縮小します。 http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

あなたのアプリが1を使用することができ、割り当てられたメモリの量を確認するには、android.os.Debug.getNativeHeapAllocatedSize()。

関連する問題