J2ME に画像をロードしますか?
-
06-09-2019 - |
質問
私は J2ME の概念についてはそれほど詳しくありませんが、あるべきではない点で怠惰なところがあります。最近、私のアプリは画像をキャンディーのようにメモリに読み込んでいます...
Sprite example = new Sprite(Image.createImage("/images/example.png"), w, h);
それが最善の方法かどうかはよくわかりませんが、昨夜までは私の Motorola Z6 では問題なく動作していましたが、古い Samsung 携帯電話でアプリをテストしたところ、画像は読み込まれず、スレッドを開始するために数回試行する必要がありました。現れます。画面が白いままになっていたので、画像の読み込みがうまくいっていないのではないかと気づきました...私のアプリで読み込みルーチンを適切に作成する方法を教えてくれる人はいますか?
解決
あなたが何を探しているのか正確にはわかりませんが、あなたが説明している動作は、OutOfMemory例外が発生しているように思えます。画像のサイズを減らしてみて (ヒープ使用量はサイズに基づきます)、動作が停止するかどうかを確認してください。これにより、それが本当に OutOfMemory の問題なのか、それとも別の問題なのかがわかります。
その他のヒント:
- 最大の画像から最小の画像までロードします。これはヒープの断片化に役立ち、最大のイメージに対して最大のヒープ領域を確保できます。
- ロードした方法と逆の順序でアンロード (null に設定) し、その後ガベージ コレクションを行います。GC を呼び出した後は、必ず Thread.yield() を実行してください。
- 必要な画像のみをロードするようにしてください。アプリケーションが存在しなくなった状態からイメージをアンロードします。
- スプライトを作成しているため、1 つの画像に複数のスプライトが存在する場合があります。イメージを一度だけロードするようにイメージ プールを作成することを検討してください。次に、各 Sprite オブジェクトを必要なプール内の画像にポイントするだけです。あなたの質問の例では、同じ画像をメモリに複数回ロードする可能性が高いようです。これは無駄であり、OutOfMemory 問題の一部である可能性があります。
他のヒント
フィルム画像(一方の画像で定義寸法によって画像のセット)を使用し、一度にそれらを引き出すためのロジックを使用します。
彼らは一つの画像にグループ化されているので、、あなたは画像ごとにヘッダースペースを節約しているため、使用するメモリを削減することができます。
この技術は最初のMIDP 1.0のメモリ制約のあるデバイスで使用した。
何度も画像を読み込まないのFostahのアプローチを使用して、私は次のクラスを作っます:
public class ImageLoader {
private static Hashtable pool = new Hashtable();
public static Image getSprite(String source){
if(pool.get(source) != null) return (Image) pool.get(source);
try {
Image temp = Image.createImage(source);
pool.put(source, temp);
return temp;
} catch (IOException e){
System.err.println("Error al cargar la imagen en "+source+": "+e.getMessage());
}
return null;
}
}
だから、私は画像を必要とする時はいつでも私が最初にそれのためにプールに尋ねるか、単にプールにロードします。