1

組み込みのゲームエディタでは、ユーザーが任意のスプライトをレベルに配置できるため、開始時にすべてのビットマップをロードする必要があるゲームを作成しています。また、レベルは、各レベルのスプライトのグループを動的にロードできるシステムなしで、さまざまなスプライトを使用します。

しばらくすると、ゲームにはすでに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日間ブラウジングしましたが、それでも途方に暮れています。

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

4

2 に答える 2

1

私はあなたの問題のより単純なバージョンに対処しなければなりませんでした.3つの2Mpixレイヤーが重なり合っていたため、当然のことながら、OOMが発生することがありました。

私の場合、3 つの ImageView を重ねて使用し、常に 6 MPix をすべてメモリに保持する代わりに、レイヤーを手動でブレンドして、一度に最大 4 MPix をメモリに保持しました (そして、" rest" - アプリケーションで変更されたレイヤー)。

これは古典的な時空間のトレードオフです。つまり、効率 (時間) を犠牲にしてメモリ (空間) を獲得します。recycle()メモリが解放されたことを確認するために、作業が完了した後に各ビットマップを作成する必要があったため、多少遅くなりました。

一貫性のない OOM については、おそらくガベージ コレクションに関係しています。ガベージ コレクターは非決定論的であり、したがってメモリ プレッシャーも非決定論的になると想定できます (GC が最後に起動された時期によって異なります)。

簡単にまとめると、メモリの使用量には非常に注意する必要があり、それを回避する方法はありません。*

*理論的には、NDK を使用して OS から直接割り当てることで、Dalvik ヒープの外部にメモリを割り当てることができます。これは巨大なハックであり、Dalvik とアロケータの間のブリッジはかなり醜いものになります。

于 2011-10-18T15:57:33.830 に答える