私はAndroidが初めてなので、この質問は明らかかもしれませんが、見つけられなかったので質問します。
私はランダムに生成された多くのオブジェクト (ゲームの敵) を扱っており、decodeResource に依存し続けるべきかどうか心配しています:
public class Bird extends Actor {
int x=0, y=0;
public Bird (Context context) {
setFace(BitmapFactory.decodeResource(context.getResources(),R.drawable.bird1));
...
または、独自の「ビットマップマネージャー」を作成して、必要に応じてビットマップを割り当て、既にデコードされている場合はそれらを再利用します。
すなわち:
public class Bird extends Actor {
int x=0, y=0;
public Bird (Context context) {
setFace(Director.getFace(Director.BIRD));
...
これには静的クラスと他の多くのものが必要ですが、おそらくdecodeResourceはすでに内部的にこれを行っていますか?
つまり、このビットマップ トラッカーを「手動で」実装することが本当に必要なのでしょうか?
とりあえず、以下のものを使用しています。
public class Artist {
private static Context mContext;
private static Hashtable<Integer, Bitmap> assets = new Hashtable<Integer, Bitmap>();
public static void setContext(Context c) {
mContext = c;
}
public static Bitmap getFace(int id){
if (assets.containsKey(id)) return assets.get(id);
Bitmap d = BitmapFactory.decodeResource(mContext.getResources(), id);
assets.put(id, d);
return d;
}
}
ただし、この静的クラスが未使用のビットマップへの参照を持っていることを心配しています (一部の敵のゲームの動きはもう来ないため)。この未使用のビットマップはガベージ コレクションされません。
アセット ハッシュ テーブルのサイズを制限して、アクセスが最も少ないビットマップを削除することで、この問題に対処する必要があると思います。
私の以前の質問に関する考えは大歓迎です。あと 2 つの質問を残します。
-「アクターの参照がなくなり、ハッシュテーブルの参照もなくなった後、ビットマップは正常にガベージ コレクションされますか?」
-私のアプローチに明らかな欠陥がありますか?