2011-08-05 1 views
1

私のゲームではサーフェイスビューが使用されています(私はGLを使うべきです)。 ゲームキャラクターのワールドコントロールにたくさんのビットマップを描きます。 LogDogを開いたときに私はこれを実行します:Androidの開発:ビットマップのサーフェイスリークメモリまたは大きすぎますか?

08-05 10:17:29.151: ERROR/dalvikvm(24048): Out of memory: Heap Size=5379KB, Allocated=2735KB, Bitmap Size=20576KB, Limit=32768KB 

私はそれがリークかどうかわかりません。

私の割り当てトラッカーは示しています。30のような

:次に

138 96 char[] 9 android.content.res.AssetManager getCookieName 

の トン:

32 80 android.graphics.BitmapFactory$Options 9 android.graphics.BitmapFactory decodeResource 

そして最後:30のように :

141 56 android.graphics.Bitmap 9 android.graphics.BitmapFactory nativeDecodeAsset 

そしてさらにいくつかのsimularもの。ここで

私はドレインが私の記憶だと思ういくつかのコードです:

player = BitmapFactory.decodeResource(getResources(), R.raw.ghostright); 
     world = BitmapFactory.decodeResource(getResources(), R.raw.lvl2); 
     thumb = BitmapFactory.decodeResource(getResources(), R.raw.thumb); 

resized = Bitmap.createScaledBitmap(player, width/10, width/6, false); 
     player = resized; 


     resized = Bitmap.createScaledBitmap(world, height*10, height, false); 
     world = resized; 


     resized = Bitmap.createScaledBitmap(thumb, height/6, height/6, false); 
     thumb = resized; 

私はresycleを使用する必要があることを聞いたが、私は常にビットマップ

//サイモン PSを使用しているため、どこを知りません:私は本当に助けが必要です.-

答えて

1

私はSurfaceViewでもたくさんのビットマップを使いますが、この問題はありません。 アニメーション化されたスプライトについては、フレームごとに個別にロードするのではなく、スプライトシートを使用できます。

あなたが参照を使用する必要はありませんが、あなただけ言うことができる "リサイズ":

プレイヤー= Bitmap.createScaledBitmap(プレイヤー、幅/ 10、幅/ 6、)。

古いビットマップは参照を失い、GCによって収集されます。より良い品質を得るために再スケーリングするときに、ビットマップフィルタリングのためにTRUEを設定したことに注意してください。

いくつかのデバイスでは、onSizeChangedは2回発生する可能性があります。これは、スケーリングを行う場所であれば、ビットマップのサイズを2倍に変更することがあります。

ロードされたビットマップの形式は、ARGB_4444またはARGB_8888などのいずれにも関係ありません。このオプションを調べる必要があります。少ないメモリしか必要としない形式を使用できる場合は、ゲームに十分な品質があります。もちろん、必要なときよりも大きなサイズの画像をメモリにロードする必要はありません。

1

これはメモリリークである必要はありません。大量のメモリに割り当てる必要がある大きなビットマップがある可能性があります。ここでは、ビットマップがどれくらいのメモリを占めるかを決める良い方法があります:W * H * 8。だから300 * 300pxのビットマップがあれば300 * 300 * 8 = 720kbです。

新しいビットマップを割り当てていないことがわかっていても、割り当てられたヒープの割り当て量を把握し、時間とともに増加するかどうかを確認します。もしそうなら、はい、メモリリークがあります。しかし、起動時にアプリがクラッシュした場合、おそらくヒープリミットを超えているだけです。

関連する問題