0

たとえば、いくつかのビットマップを複数回使用する必要があるバブル ポップに似た 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 のドキュメントをいくつか見つけましたが、それで問題が解決するかどうか、またこのキャッシュをすべてのストーン間で共有する方法がわかりません。

優れたパフォーマンスを達成し、OutofMemoryError を回避するためのベスト プラクティスは何ですか?

4

2 に答える 2

2

おそらくキャッシュは必要ありません。石の色 (ビットマップ) の数を制限する必要があるため、これらのグラフィック アセットを 1 つのクラス (おそらくstaticグローバル クラスまたはシングルトン パターンを介して) に保持することを検討できます。

クラスでは、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;
    }

}
于 2012-05-21T01:27:49.180 に答える
1

Bitmap 変数を static または static final にすることができます

于 2012-05-21T01:46:48.907 に答える