0

私はJavaの初心者で、英語が十分ではありません。皆さんが私を許してくれることを願っています。

質問 1: ArrayList(J2SE) または Vector(J2ME) があり、クラス (例: Bullet) があります。発砲すると、そのクラスのインスタンスがリストに追加され、弾丸がターゲットに命中した後、それらを破棄してリストから削除します。質問したい: 削除する必要があるオブジェクトを完全に削除する方法、つまり、そのオブジェクトが使用していたすべてのメモリを解放します (C++ の削除ポインターと同じ)。通常のオブジェクトでは「= null」が使えますが、ここではこのオブジェクトはリスト内にあり、そのような使い方はできません。System.gc() を使用しようとしましたが、それは悪い考えです。gc() を使用しない場合よりもプログラムが遅くなり、メモリが増加します。List.remove(bullet_index) のみを使用すると、メモリは少し増加しますが、減少しません。

質問 2: 「弾数無制限」で記憶に安全な銃のショットを作成する他のアイデアがあれば教えてください。

シンプルな2Dシューティングゲームを作っています

4

2 に答える 2

3

あなたは単にできません。Java は、ガベージ コレクターによるメモリの割り当てと割り当て解除のための管理された環境を提供する JVM を介して動作します。

未使用のオブジェクトの割り当てを解除することにより、JVM にメモリをクリーンアップするように指示できますが、通常、それは意図された使用方法ではありません。リストからインスタンスを削除するだけBulletです。他の参照がない場合は、最終的にそのメモリが解放されます。

本当にメモリを節約したい場合は、同じインスタンスを再利用することを検討する必要があります。これは、画面上に同時に正確な量の弾丸を表示することを計画している場合に実行できます。代わりに、期限切れの弾丸をリストから削除します。それらを別のリストに追加して、新しい弾丸を取得するために使用できます(属性を設定することにより)。このようにして、特定のしきい値を超えることを回避できます。

于 2013-01-15T03:56:16.647 に答える
1

Java はメモリ管理されているため、確実にメモリを解放することはできません。オブジェクトへのポインターがある限り、メモリが解放されないことを確認できます。オブジェクトを null に設定することは、それを指すものが何もないことを意味しますが、必ずしもその時点でガベージ コレクションされることを意味するわけではありません。Java でのメモリ管理の詳細な説明については、こちらをご覧ください。

また、ベクターの使用は避けてください。それらは同期されており、通常、新しいコードでは使用されません。

于 2013-01-15T03:56:31.377 に答える