組み込みのゲームエディタでは、ユーザーが任意のスプライトをレベルに配置できるため、開始時にすべてのビットマップをロードする必要があるゲームを作成しています。また、レベルは、各レベルのスプライトのグループを動的にロードできるシステムなしで、さまざまなスプライトを使用します。
しばらくすると、ゲームにはすでに250以上のpng画像があり、合計サイズは3.5MBです。
ゲームは、オプションを設定せずにBitmapFactory.decodeStreamを使用してほとんどのスプライト(約200)をロードします。また、アクティビティのxmlレイアウトで参照される他のスプライトは約50あります。
さまざまなデバイスでテストすると、ゲームのメモリが不足することがありますが、パターンを見つけることができず、画像のサイズや数を減らすなど、どれだけ行う必要があるかを判断することさえできません。
私が開発した電話、Android 2.224MBVMヒープサイズのHTCdesireはOOMを実行しません。
Android2.2および40MBのVMヒープサイズを備えたDellStreakも、OOMを実行することはありません。
Android2.1および24MBVMヒープサイズを備えたMotorolaマイルストーンは、すべてのスプライトを正常にロードしますが、アクティビティの1つを開始するときにImageViewで使用される最後のいくつかのイメージをチョークします(スタートメニュー)。そのようなImageViewのいくつかをコメントアウトすると、ロードは問題ありませんが、後で他のアクティビティの1つで窒息する可能性があります。また、起動によって断片化が異なるため、安定していません。
私の相棒が2.2のHTCヒーロー(ヒープサイズは16MBですか?)もクラッシュします。
最も紛らわしいのは、モトローラがHTCの要望と同じ24MBを持っていることです。2.1はメモリ管理の効率を低下させていますか?(たとえば、より多くの断片化につながりますか?)または、すべてのMotorola電話でメモリ管理が悪化しますか?では、なぜ2.2のHTCヒーローがクラッシュするのでしょうか。HTCヒーローよりもHTCの欲求の方が大きいのは何ですか?
OOMは古い電話で発生するように見えますが、これまで私が理解したのはそれだけです。
OOMが市場の5%などの古い電話でのみ発生する場合は、クラッシュレポートを収集し、サポートされているリストからクラッシュしたものをすべて除外するだけで、サポートされているデバイスから2.1以上の特定のリストを除外できます。それ以外の場合は、すべての画像を一定の係数(1.6など)で縮小する必要があります。これは、設計とテスト、GUI要素の再配置などに何日もかかった45レベルすべてのサイズを変更することを意味します。 dまだわかりません。どのデバイスで、ビットマップの合計サイズをたとえば2倍に減らすだけで、OOMを回避できます。
これについて何かアドバイスはありますか?BitmapFactoryに特定のオプションを設定する必要がありますか?ところで、ほとんどの画像には透明なbgピクセルがあり、私が理解している限り、565形式で取得することはできません。
私はここや他の場所で2日間ブラウジングしましたが、それでも途方に暮れています。
ありがとうございました。