0

我是android新手,所以也许这个问题很明显,但我会问它,因为我没有找到它。

我正在处理许多随机生成的对象(游戏中的敌人),我担心我是否应该继续依赖 decodeResource:

public class Bird extends Actor {
int x=0, y=0;

public Bird (Context context) {
    setFace(BitmapFactory.decodeResource(context.getResources(),R.drawable.bird1));

...

或创建我自己的“位图管理器”以根据需要分配位图并在已解码的情况下重用它们。

IE:

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;
    }
}

虽然,我担心这个静态类引用了未使用的位图(因为游戏在某些敌人身上移动不再出现),那么这些未使用的位图不会被垃圾收集。

我想我必须通过限制资产哈希表的大小来解决这个问题,从中删除访问最少的位图。

欢迎对我之前的问题提出任何想法,我将再留下两个问题:

- 在他们的'Actor'引用消失并且哈希表中的引用也消失后,位图是否会成功进行垃圾收集?

- 你发现我的方法有什么明显的缺陷吗?

4

0 回答 0