我正在创建类似于Bubble Pop的Android棋盘游戏,我需要多次使用多个位图。
我有一个Stones列表(10x10),其中每个Stone都是一个保存其位图和其他值的对象。许多位图(石头颜色)是相同的。
现在我正在为列表中的每个Stone使用类似的东西:
public class Stone extends Point{
private Bitmap mImg;
public Stone (int x, int y, Resources res, Stones mStone) {
...
mImg = BitmapFactory.decodeResource(mRes, mStone.getId());
}
protected void changeColor(Stones newD){
mStone = newD;
mImg = BitmapFactory.decodeResource(mRes, mStone.getId());
}
}
我发现了几个类似的问题,但这些都是关于大位图的。我也发现了一些Android documentation about caching images,但我不确定它是否解决了我的问题,以及如何在我的所有宝石之间共享这个缓存。
为达到良好的性能并避免OutofMemoryError,最佳做法是什么?
答案 0 :(得分:2)
您可能不需要缓存。由于您应该使用有限数量的石头颜色(因此位图),您可以考虑将这些图形资源保存在一个单独的类中(可能是static
全局类或singleton pattern。
在Stone
课程中,您只需要保存石头的颜色ID并从资产类中获取drawable
。 (你可以保存位图,但是drawable效率更高,你可以轻松地改变它以便以后允许一些动画)
例如:
// Singleton - look at the link for the suggested pattern
public class GraphicAssets {
private Context mContext;
private Hashtable<Integer, Drawable> assets;
public Drawable getStone(int id){
if (assets.containsKey(id)) return assets.get(id);
// Create stone if not already load - lazy loading, you may load everything in constructor
Drawable d = new BitmapDrawable(BitmapFactory.decodeResource(mContext.getResources(), id));
assets.put(id, d);
return d;
}
}
答案 1 :(得分:1)
你可以使Bitmap变量为static或static final