Рекомендации по многократной загрузке нескольких растровых изображений

Я создаю настольную игру для Android, похожую, например, на Bubble Pop. где мне нужно использовать несколько растровых изображений несколько раз.

У меня есть список камней (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 о кэшировании изображений, но я не уверен, решит ли это мою проблему и как разделить этот кеш между всеми моими камнями.

Как лучше всего добиться хорошей производительности и избежать OutofMemoryError?


person Komi    schedule 21.05.2012    source источник


Ответы (2)


Вам, вероятно, не нужен кеш. Поскольку у вас должно быть ограниченное количество каменных цветов (таким образом, растровых изображений), вы можете рассмотреть возможность хранения этих графических ресурсов в одном классе (вероятно, static глобальном классе или через одиночный шаблон.

В вашем классе Stone вам просто нужно сохранить идентификатор цвета камня и получить 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;
    }

}
person xandy    schedule 21.05.2012
comment
Вам, вероятно, не нужен кеш. кажется, противоречит остальной части ответа, поскольку вы по существу показываете, как реализовать простой кеш для растровых изображений. :-) - person Jonik; 30.04.2015

вы можете сделать переменную Bitmap статической или статической окончательной

person MikeT    schedule 21.05.2012