android game-GCが起動しないようにゲーム要素を保存する方法


8

私はAndroidゲームを開発していますが、ガベージコレクターを起動せずにゲーム要素を保存することについて質問があります。

私のゲームには、x、yの位置に従ってゲーム要素が格納されているコレクションが必要です(すべてのゲーム要素には、x、y、幅、高さがあります)。次に、コレクションはフレームごとに呼び出され、cameraX、cameraY、カメラの幅と高さに従って要素を取得します(ユーザーはゲーム内をスクロールできます)。

例:

 function draw() {
   tmp = collection.getElements(tmp,cameraX,cameraY,cameraWidth,cameraHeight);
     for(int i = 0; i < tmp.size(); i++) {
        tmp.get(i).draw();
     } 
  }

現在、コレクション要素を表すためにVectorクラスを使用していますが、gcは数分おきに起動し続けます。私はすべての割り当てを前もって行います。また、getElements関数を変更して、もう1つのパラメーター-要素で埋められて返される一時ベクトル(前もって割り当てられている)を受け入れます。

GCが起動しないように、ゲーム要素をどのように保存すればよいですか(できれば、私はできません)。

実行時にコレクションにも要素を追加しますが、それらも事前に割り当てる必要がありますか?

回答:


3

はい、実行時に何かを割り当てると、最終的にはGCがトリガーされます。一般に、オブジェクトプールを実装することでこれを回避します...そのようにして、弾丸やその他のエンティティなどのすべてのオブジェクトを事前に割り当て(または少なくとも再利用のために新しいインスタンスを収集)して、GCのトリガーを回避できます。

編集:実行時にオブジェクトが生成されているルーチンを特定するのに役立つメモリプロファイラー(Eclipseメモリアナライザーなど)を使用することもできます。


Vectorクラスを使用するようにMyObject []を使用しますか?しかし、オブジェクトプールのサイズを事前に割り当てて、オブジェクトを動的に追加および削除できるようにする必要があります... MyObject [] pool = new MyObject [MAX_OBJECTS];のようなもの。これはどういう意味ですか?
Jernej 2011年

より具体的には、新しいオブジェクトの割り当てを100%回避したい場合は、その配列に含まれる各インスタンスを割り当てる必要があります。私はXNAフレームワーク用のクラスをC#で記述しました。バランスの取れたXNAフレームワークです。プールに既存のインスタンスがない場合にのみ、新しいインスタンスが作成されます。その結果、最初の数秒でいくつかのオブジェクトが割り当てられる可能性がありますが、インスタンスの最大同時数に達すると、新しい割り当ては発生しません。javaに変換するのは比較的簡単です:codecube.net/2010/01/xna-resource-pool
Joel Martinez

2

また、Androidエンジニアが開発したレプリカアイランドのソースコードも一読することをお勧めします。彼は、カスタムオブジェクトのプール用に拡張できる汎用オブジェクトプールクラスを持っています。また、オブジェクトの配列をトラバースするときにイテレーターを使用する必要がないように、カスタム配列クラス(追加/削除/検索機能付き)もあります。

また、EclipseのAndroid SDKのDDMSはメモリ割り当てを追跡できることにも言及したいと思います(画像の「割り当てトラッカー」タブを参照)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.