Ich schreibe eine etwas komplexe Spielengine in Android.Android: Update Thread verursacht GC eine Tonne laufen
Derzeit habe ich einen Thread zum Aktualisieren von Subsystemen verwendet.
Innerhalb der Update-Methode befindet sich die Methode zum Aktualisieren der Spiellogik, die auf dem aktuellen Spielstatus basiert.
Der Spielstatus hat eine Szene, die aktualisiert wird. Szenen bestehen aus einem Wurzelknoten, der eine einfache Szenengraphstruktur erzeugt.
Wurzeln sind Knoten, die Kinder haben, die auch aktualisiert werden und so weiter und so weiter.
Wie auch immer, das ist alles nett und dandy und funktioniert gut, bis ich eine Million davon in meinem Logcat: 03-29 09: 23: 22.866: D/dalvikvm (18554): GC_CONCURRENT befreit 511K, 52% kostenlos 2773K/5767K, externe 77K/587K, pausiert 2ms + 3ms
Ich habe die Ursache des Lecks als die Update-Schleife isoliert, als wenn ich meine Methode auskommentieren Subsysteme zu aktualisieren, gibt es keine GC-Nachrichten. Außerdem habe ich mich tief in die Update-Schleife und bis zu dem Punkt geäußert, an dem das Child-Update des Root-Knotens der Punkt ist, an dem der GC rasend schnell laufen würde.
(GameLgoic)
public void onUpdate(float deltaTime)
{
if (gameState != null)
gameState.onUpdate(deltaTime);
}
(GameState)
public void onUpdate(float deltaTime)
{
scene.onUpdate(deltaTime);
}
(Scene)
public void onUpdate(float deltaTime)
{
root.onUpdate(deltaTime);
}
(SceneNode)
public void onUpdate(float deltaTime)
{
for (int i = 0; i < children.size(); ++i)
{
children.get(i).onUpdate(deltaTime); // Memory leak runs crazily here
}
}
Wenn ich children.get (i) auf Kommentar .onUpdate (DELTA) Es gibt keine Lecks! Mein Verstand ist so verblüfft. Danke Leute.
gute Nachricht: Ihr Leck nicht die onUpdate() -Aufruf ist. Es ist der Code, der in dieser Methode enthalten ist. Bitte fügen Sie die entsprechenden Code-Snippets hinzu. – WarrenFaith
Bitte zeigen Sie die Definition von 'Kinder' und die dazugehörige' OnUpdate' Methode an. – Gray
Oh, und jedes Mal, wenn Sie 'size()' in einer Schleife aufrufen, stirbt ein Kätzchen. Sie sollten die Leistungsbeschreibung in der offiziellen Dokumentation überprüfen :) – WarrenFaith