2012-05-21 2 views
0

Je crée un jeu de plateau Android semblable, par exemple, à Bubble Pop où j'ai besoin d'utiliser plusieurs bitmaps plusieurs fois.Meilleures pratiques pour charger plusieurs bitmaps plusieurs fois

J'ai une liste de Stones (10x10), où chaque Stone est un objet qui contient son bitmap et d'autres valeurs. Beaucoup de bitmaps (couleurs de pierre) sont les mêmes.

En ce moment je suis en utilisant quelque chose comme ça pour chaque pierre dans la liste:

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

J'ai trouvé plusieurs questions similaires, mais il est tout au sujet de grands bitmaps. Aussi j'ai trouvé quelques Android documentation about caching images, mais je ne suis pas sûr si cela résout mon problème et comment partager cette cache entre toutes mes pierres.

Quelle est la meilleure pratique pour obtenir de bonnes performances et éviter OutofMemoryError?

Répondre

2

Vous n'avez probablement pas besoin de cache. Étant donné que vous devriez avoir un nombre limité de couleurs en pierre (donc bitmaps), vous pouvez envisager de tenir ces actifs graphiques dans une classe unique (probablement static classe mondiale ou par singleton pattern.

Dans votre classe Stone, il vous suffit de tenir la pierre de couleur Id et obtenir le drawable de votre classe d'actifs (vous pouvez enregistrer bitmap, mais drawable est beaucoup plus efficace et vous pouvez facilement changer pour permettre une animation plus tard)

Par exemple:.

// 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

Merci beaucoup. Il semble être une très bonne solution de mon problème. – Komi

+1

"Vous n'avez probablement pas besoin de cache." semble contredire le reste de la réponse, puisque vous montrez essentiellement comment implémenter un cache simple pour les bitmaps. :-) – Jonik

1
vous

pourrait faire la variable Bitmap sta tic ou statique final

Questions connexes