我是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'引用消失并且哈希表中的引用也消失后,位图是否会成功进行垃圾收集?
- 你发现我的方法有什么明显的缺陷吗?