0

ゲームの背景画像といくつかの小さな画像を読み込んで Canvas に配置し、オーバーレイされた小さな画像 (移動、回転など) をユーザーが操作できるようにしようとしています。

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

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

タブレット/電話に対応するために、1600x1000 および 200kb の背景 PNG 背景画像があります。

ただし、サイズを変更しようとするとビットマップが 1600x1000x4byte=6.4 MB の RAM になるため、メモリ不足の問題に苦しんでいます。(これらの問題が発生した時点でエミュレータを使用しています)

canvas.setBackgroundResource を使用するように変更することにしました

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

これはうまく機能しますが、画面全体に表示され、縦横比が維持されません。

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

4

2 に答える 2

1

Java コードは約 20MB 程度のヒープ サイズしか許可されていないため、(C/C++ などのネイティブ コードに頼らない限り) 大きなビットマップでは常に問題が発生します。

1 つのオプションは、BitmapFactoryを使用してイメージをロードすることです。オプションでは、inSampleSize を指定して、イメージが読み込まれるときにイメージをダウンサンプリングできます。これにより、元のイメージ全体をロードしようとすることでメモリを消費することを回避できます。inJustDecodeBounds オプションさえあるので、コードにハードワイヤードする代わりに、コードで画像のサイズをチェックできます。

于 2012-04-22T09:11:31.477 に答える
0

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

  • NDK(ネイティブ開発キット)とJNIを使​​用してネイティブコードからメモリを割り当てます

  • 画像の場合、OpenGLテクスチャを使用することもできます。テクスチャメモリは制限にカウントされません。

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

アプリが使用できるメモリの量を確認するには、android.os.Debug.getNativeHeapAllocatedSize()を使用します。

于 2012-04-22T14:23:27.187 に答える