2011-10-12 3 views
0

私のアプリでスキンを使用し、いくつかのアクティビティで1.5Mbの画像をロードします。 これは問題ではありません.... 1.5Mb +デフォルトでは〜6Mbのアプリケーションがロードされますが、状況はかなり異なります。 私はレイアウトxmlsのドロアブルとしてロードする各pngは、実際のサイズから少なくとも10を掛け合わせています....私は何も黒画面を除いてサンプルアプリケーションを書いて、 5.8Mbのネイティブヒープを取得し、25Kbの小さなpngをロードし、6.25Mbを推測します。 私のアプリケーションにはスキンだけがロードされ、14.5Mbで起動しました!!!!!!!!私のアプリは、ネイティブヒープで膨大な量のMbを消費します(画像の実際のサイズよりもはるかに多く)

今私は、すべてのアクティビティが変更された後、ビットマップリサイクル操作を行う途中です。

これはアンドロイドの既知の問題ですか? pngファイルはネイティブヒープ内ではるかに大きなサイズでロードされますか? 私の現在の計画以外の解決策はありますか?

ありがとうございました。

答えて

0

PNGファイル(およびJPEGなどの他の多くの画像フォーマットと同様)は、圧縮ファイルであり、zipファイルとほぼ同じです。それらをメモリにロードすると、圧縮解除されて となり、結果としてより多くの領域を占有します。

内部の数値はどれも、image configに依存しますが、デフォルトはARGB8888で、1ピクセルあたり4バイトです。したがって、メモリ消費量はディスクのファイルサイズではなく、画像サイズに依存します(かなり小さくなる可能性があります。たとえば、1つの色からなる500x500ピクセルビットマップは良好な圧縮率を持っています)

500x500ピクセルの画像の例は、ほぼ1メガバイトの500*500*4 bytes = 0.954 MBです。

+0

私は、メモリを使い果たしていない唯一の解決策は、アクティビティを再開したり一時停止したりするときに、大きなPNGを読み込んでリサイクルすることです。 – iAndroid

+0

サイズを小さくすることは別として、そうです。 ndkを使用してネイティブコードでビットマップを読み込むこともできます。これはメモリの制限をバイパスします。しかし、私はそれを経験していないので、ちょっと調べてみてください。また、[android outofmemory exception](http://stackoverflow.com/search?q=%5Bandroid%5D+bitmap+outofmemory+exception)を検索してみてください。この例外は、人々がビットマップを使用して多すぎるメモリを割り当てようとするときによく発生します。十分に文書化されています(memフットプリントを減らすためのすべての可能な解決法を用いて)。 –

+0

最後の2日間私はoutofmemory例外を探していました....私は今まで心にそれをすべて知っていると思う.... :)それは私がリサイクルしなければならないことを考え出したところです。画像の解像度を落とさずに(ケーキを食べるなど....)より良い解決策。ありがとう! – iAndroid

関連する問題