【问题标题】:Best practices to load several bitmaps multiple times多次加载多个位图的最佳实践
【发布时间】:2012-05-21 01:06:43
【问题描述】:

我正在创建一个类似于 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 的最佳做法是什么?

【问题讨论】:

    标签: android caching bitmap android-bitmap


    【解决方案1】:

    您可能不需要缓存。由于您应该拥有有限数量的石头颜色(因此是位图),您可以考虑将这些图形资源保存在一个类中(可能是 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;
        }
    
    }
    

    【讨论】:

    • "你可能不需要缓存。"似乎与答案的其余部分相矛盾,因为您基本上展示了如何为位图实现简单的缓存。 :-)
    【解决方案2】:

    您可以将位图变量设为静态或静态最终

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2011-11-29
      • 2012-12-21
      • 1970-01-01
      • 2019-12-26
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多