1

私は Android にはかなり慣れていませんが、タイル ベースのゲームを試してみたいと思っていました。このゲームでは、正方形ごとにマップ内を移動します。

ただし、多くのリソースを開く際に問題が発生しています。今のところ、各タイルに同じ画像を使用しています (ただし、将来的には明らかに変更される予定です)。

問題は、適切なサイズのマップをこのコードで作成する場合です。

mBitmap = BitmapFactory.decodeStream(new BufferedInputStream(res.openRawResource(R.drawable.tile)));
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight());
canvas.drawBitmap(mBitmap, mX, mY, null);

エミュレート時にエラーが発生しています...

エミュレーター/電話のメモリが限られていることは理解していますが、20x20タイルを保持するのに十分だと思いましたか?

-もっと大きなマップが欲しいと思っていましたが、考えられる唯一の回避策は、タイルが見えなくなったらそれらを破壊し、タイルが見えてきたら(移動すると)新しいタイルを描画することです

私はここでそれをやろうとしました:

if (tile.mX > 100 && tile.mX < 600){
   tile.mBitmap = null;
} else {
   //draw it with code above
}

したがって、上記のコードは、配列内の各タイル (フレームごと) をループし、特定の X 座標内にあるタイルのみを描画します。

これがそれを行う「方法」であるかどうか疑問に思っていましたか?-移動するたびにビットマップを開いて無効にしますか? それとももっと簡単な方法がありますか?プログラムをより効率的にするヌルよりもビットマップを破壊するコマンドを見逃していませんか?

プログラムはエミュレータ上で非常に遅く実行されますが、これは問題ですか? -または、エミュレーターでフレームごとに多くのビットマップをロードすると遅くなると想定しても安全ですか? 電話デバイスではまだ遅くなりますか?

ヒント/ヘルプは素晴らしいでしょう、ありがとう!

4

1 に答える 1

1

毎回ビットマップをロード/解放する必要はないと思います。また、大量の (大きな) ビットマップを処理するプログラムを作成しましたが、Android API によって提供されるLruCacheクラスに出くわすまで、多くのメモリの問題がありました(リンクされた JavaDoc には、それをビットマップに使用する方法の例もあります)。LRU は Least Recent Used の略で、基本的には使用時間の短い要素を保持し、長期間使用されていない要素を削除します。

したがって、あなたがすべきことは次のとおりです: を使用してプレイフィールドをペイントします。これは、メソッドが呼び出されるSurfaceViewたびにペイントする必要があることを意味します。drawしたがって、描画するときは、どのタイルが表示されているかを知る必要があり、それらのタイルをペイントするだけです. すべてのタイルについて、LruCache を検索して、そのビットマップが既に読み込まれているかどうかを確認します。読み込まれている場合は、サーフェス ビューの正しい位置にペイントするだけです。ビットマップがキャッシュにない場合は、ロードし、キャッシュに入れてサーフェスにペイントします。

于 2013-01-12T16:36:02.570 に答える