2012-05-21 18 views
0

我正在创建一个类似于Bubble Pop的Android桌面游戏,我需要多次使用多个位图。多次加载多个位图的最佳实践

我有一个石头列表(10x10),其中每个石头是一个对象,它持有它的位图和一些其他值。很多位图(石头颜色)都是一样的。

现在我使用这样的事情,每石列表:

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?

回答

2

您可能不需要缓存。既然你应该有石头的颜色(因此位图)数量有限,可以考虑在一个单独的类(可能static全局类或通过singleton pattern持有这些图形资源。

在你Stone类,你只需要保持石材的颜色标识,并从你的资产类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; 
    } 

} 
+0

非常感谢。这似乎是我的问题非常好的解决方案 – Komi

+1

“你可能不需要缓存。”似乎与答案的其余部分相矛盾,因为你基本上展示了如何为位图实现一个简单的缓存。 :-) – Jonik

1

你可以使Bitmap变量稳定tic or static final