我是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;
}
}
尽管如此,我担心这个静态类引用了未使用的位图(因为游戏移动了一些敌人不再来了),那么这些未使用的位图将不会被垃圾收集。
我想我必须通过限制资产哈希表的大小来解决这个问题,从中删除访问量最少的位图。
欢迎任何关于我以前的问题的想法,我还会再提出两个问题:
- 在'参与者的引用消失并且散列表中的引用也消失后,位图是否成功进行垃圾回收?
- 你发现我的方法存在一些明显的缺陷吗?