Ich entwickle ein Android-Spiel und habe eine Frage zum Speichern der Spielelemente, ohne Garbage Collector auszulösen.
Mein Spiel benötigt eine Sammlung, in der die Spielelemente nach x- und y-Positionen gespeichert sind (alle Spielelemente haben x, y, Breite und Höhe). Die Sammlung wird dann jedes Bild aufgerufen, um die Elemente nach cameraX, cameraY, Kamerabreite und -höhe abzurufen (der Benutzer kann durch das Spiel scrollen).
Beispiel:
function draw() {
tmp = collection.getElements(tmp,cameraX,cameraY,cameraWidth,cameraHeight);
for(int i = 0; i < tmp.size(); i++) {
tmp.get(i).draw();
}
}
Ich verwende derzeit die Vector-Klasse, um die Sammlungselemente darzustellen, aber der GC wird alle paar Minuten ausgelöst. Ich mache alle meine Zuweisungen im Voraus. Ich habe auch die Funktion getElements geändert, um 1 weiteren Parameter zu akzeptieren - einen temporären Vektor (im Voraus zugewiesen), der mit Elementen gefüllt und dann zurückgegeben wird.
Wie soll ich die Spielelemente speichern, damit der GC nicht ausgelöst wird (ich bevorzuge es niemals, wenn möglich)?
Ich füge der Sammlung zur Laufzeit auch Elemente hinzu. Muss ich sie auch im Voraus zuweisen?
Ich empfehle auch, den Quellcode für Replica Island durchzulesen , der von einem Android-Ingenieur entwickelt wurde. Er verfügt über eine generische Objektpoolklasse, die für Pools benutzerdefinierter Objekte erweitert werden kann. Er verfügt außerdem über eine benutzerdefinierte Array-Klasse (mit Funktionen zum Hinzufügen / Löschen / Suchen), um zu vermeiden, dass beim Durchlaufen eines Arrays von Objekten ein Iterator verwendet werden muss.
Außerdem möchte ich erwähnen, dass das DDMS im Android SDK in Eclipse Speicherzuordnungen verfolgen kann (siehe Registerkarte Allocation Tracker im Bild).
quelle