2011-12-28 7 views
4

SurfaceViewでゲームを開発しています。それは約15〜20枚の画像を含み、一部の画像は平均で320X400の解像度を有する。私はDrawableとして画像を使用して、画面上の画像を描画する描画可能のdraw(canvas)方法を使用しています2 questions-面白い、キャンバス - 描画可能またはビットマップを使用するAndroidゲーム

  1. を持っています。私はいくつかのゲームで人々が画面に画像を描画するDrawableの代わりにBitmapを使用することを参照してください、DrawableまたはBitmapアンドロイドゲームとして画像を使用する違いは何ですか?キャンバス上に描画する際に、メモリ効率が良く、パフォーマンスが良いのはどちらですか?

  2. 今、私はDrawableの配列を作成し、ゲームで使用されるすべての画像のDrawableオブジェクトを作成し、ゲームプレイ中にすべての画像が必要なので、それぞれの配列に配置します。 Drawableのすべてのイメージを開始時にロードするか、必要なときDrawableオブジェクトを作成し、表示されていない他のオブジェクトをnullにし、イメージが表示または削除されるたびにこのプロセスを繰り返します。オブジェクトの作成とヌル処理のプロセスを繰り返すことは悪影響を及ぼすか、一度にすべてのイメージをロードするよりも良いでしょうか?

おかげ

答えて

3
  1. 私の経験のビットマップによると、描画可能なよりも高速です。私はdrawableで40〜45 fpsで動作するアプリケーションをテストしています。ビットマップでは57〜59 fpsになります。それは人々がゲームのために使っているからです。

  2. 十分なメモリがある場合は、まずすべてのイメージをロードすることをお勧めします。オブジェクトの作成と破棄を開始すると、頻繁にガベージコレクタが呼び出され、実際には遅くなります。高性能を必要としない場合は、オブジェクトを作成して破棄するとメモリの使用量が減少します。あなたがゲームを作ろうとしているのであれば、このリンクが役に立つかもしれません。個人的な経験から話す

Google I/O 2009 - Writing Real-Time Games for Android特に分22時30分、高速Javaコード

2

あなたがBitmapsではなくDrawablesに行く必要があります。これにより良い結果が得られます。

あなたが必要とするものは(私が言うことができる限り)スクリーンに表示される画像なので、ビットマップはあなたのオプションに最適です。

A Drawableのは、より広い範囲(アンドロイドデベロッパーのウェブサイトからドキュメントを)持っている:

A Drawableのはのための一般的な抽象化である "描くことができるもの。" 多くの場合、描画可能なリソースのタイプとしてDrawableを処理します。 Drawableクラス は、基礎となる視覚資源 を扱うための汎用APIを提供しています。さまざまな形式があります。ビューとは異なり、Drawableには にはイベントを受信するか、または ユーザーと対話する機能がありません。

ゲームが始まる前に必ずすべてのビットマップを読み込みます。これはきれいなアプローチです。そうしなければ、GCのためにゲームが遅れる可能性があります。

すべての静的ビットマップフィールドを含むクラスを作成できます。

NB:

public static Bitmap foo; 

は、その後、あなたの活動のクラスで、あなたはこれらのビットマップを(私は通常資産のフォルダに私のビットマップを置く)をロードすることができますそれは世話をするにloadscreenやスプラッシュと呼ばれるクラスを作成するために、おそらく最善ですすべての初期化の。このようにすれば、アクティビティクラスへの参照をそのクラスに渡す必要があります。

ユーザーがゲームを終了することを決定したとき、あなたはそのようなすべてのビットマップをアンロードする必要があり
Assets.foo = readAssetsBitmap("foo.png"); 

public Bitmap readBitmapFromMemory(String filename) { 
     Bitmap defautBitmap = null; 
     File filePath = getFileStreamPath(filename); 
     FileInputStream fi; 
     try { 
      fi = new FileInputStream(filePath); 
      defautBitmap = BitmapFactory.decodeStream(fi); 

     } 
     catch (FileNotFoundException e) { 
      e.printStackTrace(); 

     } 

     return defautBitmap; 

    } 

disposeBitmap(Assets.foo); 

public void disposeBitmap(Bitmap bitmap) { 
     bitmap.recycle(); 
     bitmap = null; 

    } 

私はこのことができます願っています。

関連する問題