この質問には、パフォーマンス上の理由からJavaでのメモリ管理が含まれます。このプログラムをAndroidゲームとして開発しており、メモリGCによってパフォーマンスが低下するためです。そのため、これまでに多くの作業を行っており、ゲームのメモリ使用量を最適化するという素晴らしい仕事をしていることがわかりましたが、問題が1つあります。それはイテレータです。
これが私がしていることです:
- ゲームレベルを開始します。
- 割り当てトラッカーを開始します(この方法では、レベルが実行されている限り残るすべての割り当てを無視します。レベルの最初に1回だけ作成されるオブジェクトが多数あり、問題はありません)。
- レベルでいくつかのことを行い、割り当てを取得します。
私の割り当てはこれでいっぱいです:
466 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
465 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
464 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
463 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
461 24 java.util.AbstractList $ SimpleListIterator 12 java.util.AbstractList iterator
456 24 java.util.ArrayList $ ArrayListIterator 12 java.util.ArrayList iterator
45424java。 util.ArrayList $ ArrayListIterator 12 java.util.ArrayList iterator
453 24 java.util.ArrayList $ ArrayListIterator 12 java.util.ArrayList iterator
452 24 java.util.ArrayList $ ArrayListIterator 12 java.util.ArrayList iterator
したがって、ゲームの実行中に割り当てられるオブジェクトはイテレータだけです。さて、それを修正するために...私が尋ねた問題を引き起こしているコードは何ですか...ここにあります:
for (Segment side : listOfSides.getSides()) {
// do stuff
}
はい、for-each構文は、各要素にデータを入力するために舞台裏でイテレータを呼び出します。これは完全に理にかなっており、私が期待していたこととまったく同じですが、それがそれほどひどく蓄積され、ゲームのパフォーマンスの問題を引き起こす可能性があることに気づいていませんでした。この問題を取り除くことができれば、どの電話を使用していても、ゲームは本当に稲妻のように動作します。だから私の質問は、これらの一時的なイテレータのすべてが作成されてすぐに破棄されて厄介なGCの実行が発生しないようにするにはどうすればよいですか?私のコードを完全に醜くしない方法でそうすることのボーナスポイント!(Androidでndkを使用することはできません)
PSすべてのArrayListについて、get(int i)関数を使用し始めることができると考えていました。これらは舞台裏の配列であり、ヒープではなくスタックに配置されるインデックスに使用する整数です。しかし、HashMapやLinkedListのような他のオブジェクトについては、何をすべきかわかりません。