2

ガベージ コレクションが原因で、ゲームで一時的な中断やフレームのドロップが発生することがあります。そのため、不要な割り当てを削除することでこれを削減しようとしています。

Eclipse で割り当てトラッカーを使用すると、以下のコードが表示されます。

for (IGameObject obj : mObjects) {
  //stuff
}

イテレータを割り当てています:

java.util.ArrayList$ArrayListIterator   24 bytes    java.util.ArrayList iterator

mObjects はArrayList.

興味深いことに、proguard または jit は何らかの方法でこれを基本的なforループに最適化しますか? 残念なことに、この割り当てを避けるためにコードをより冗長にする必要があります。

4

2 に答える 2

1

まあ、人々が言っ​​たように、それが本当に問題でない限り最適化しないでください。

int sz = mObjects.size();
IGameObject gameObject = null;
for (int i=0;i<sz;i++) {
    gameObject = mObjects.get(i);
}

この場合、インデックスでループしているだけです。ArrayList の場合、これは非常に効率的です (おそらく速度の観点からはイテレータと同じくらい効率的です)。ただし、ある時点で代わりに LinkedList をドロップすると、.get(index) は LinkedList に対して非常に非効率的であるため、大きなリストの場合は地獄になります。

本当にメモリの問題がない限り、余分な 24 バイトについて心配する必要はありません。

于 2012-09-30T17:19:49.880 に答える
0

メモリ消費を制御する最善の方法は、割り当てを自分で行い、基本構造で行うことです。

たとえば、ArrayList mObjects を単純な配列に変換できますIGameObject[] mObjects = new IGameObject[MAX_GAME_OBJECTS];(ゲームが処理できるオブジェクトの最大数を把握/計算する必要があります)。さらに、オブジェクトを再利用する必要があります。配列boolean[] isObjAlive = new boolean[MAX_GAME_OBJECTS];(mObjects と同じ次元) を保持することができます。これは、最初に表示されなくなったオブジェクトを知るのに役立ち、次にオブジェクトが再利用可能であるかどうかを知るのに役立ちます。

 for(i=0;i<MAX_GAME_OBJECTS;i++){
    if(isObjAlive[i]){
        // draw the object or anything else...
    }
 }

再利用:

 for(i=0;i<MAX_GAME_OBJECTS;i++){
    if( ! isObjAlive[i]){
        // use the setters to customize your object for the new role...
    }
 }
于 2012-10-01T06:14:05.233 に答える