Sono al centro di un'enorme applicazione in un team di sviluppatori e la memoria è qualcosa da considerare subito. Quando eseguo il programma così com'è, ci vogliono circa 44 MB di memoria (trovati dal Task Manager). Quindi creo 10.000 corpi. L'utilizzo della memoria è ora di circa 83 MB. Ho un metodo per distruggere i corpi quando clicco lo spazio, ecco come appare.Utilizzo della memoria in LibGdx
public static void disposeAllBodies(){
Array<Body> bodies = new Array<Body>();
world.getBodies(bodies);
int destroyCount = 0;
System.out.println("Attempting to destroy " + world.getBodyCount()+ " bodies");
for(Body b : bodies){
world.destroyBody(b);
destroyCount++;
}
System.out.println("Successfully destroyed " + destroyCount + " body(s), " + world.getBodyCount() + " remain");
}
Dispone tutti i corpi senza alcun problema, e queste erano le uniche cose nell'applicazione. Dopo che sono stati eliminati, la memoria scende a circa 66 MB per alcuni secondi, quindi salta fino a 78 MB e rimane lì.
Quindi mi chiedo se esista un modo migliore per smaltire questi corpi? Questa applicazione creerà milioni di corpi ma la maggior parte verrà distrutta, tuttavia se la memoria continua a salire, non sarà in grado di gestire questo molto smaltimento dato che la memoria rimane abbastanza statica.
Inoltre, la CPU passa dallo 0,2% (prima di qualsiasi corpo) al 23% (quando sono presenti 10.000 corpi) quindi va al 2,3% (quando si dispone di corpi). Quindi anche la CPU sta facendo più lavoro dopo lo smaltimento dei corpi.
Grazie per qualsiasi aiuto!
Update: Il codice per la creazione di corpi è la seguente:
BodyDef bodyDef = new BodyDef();
bodyDef.type = type;
bodyDef.position.set(new Vector2(position.x, position.y));
Body body = world.createBody(bodyDef);
FixtureDef fixtureDef = new FixtureDef();
Fixture fixture;
if(isCircle){
CircleShape circle = new CircleShape();
circle.setRadius(dimensions.x);
fixtureDef.shape = circle;
fixture = body.createFixture(fixtureDef);
circle.dispose();
}else{
PolygonShape rectangle = new PolygonShape();
rectangle.setAsBox(dimensions.x, dimensions.y);
fixtureDef.shape = rectangle;
fixture = body.createFixture(fixtureDef);
rectangle.dispose();
}
Questi sono tutti solo corpi Box2D, non sprite attaccati o niente. Grazie!
potresti includere anche il codice che utilizzi per creare i corpi? –
Sono solo i corpi box2d che stai creando/distruggendo? Aggiungi qualcosa (come un'istanza Entity/Actor) agli UserData del corpo che potrebbero non essere liberati/eliminati? Quando crei i tuoi corpi, in particolare i proiettori, distruggi gli oggetti di forma che usi durante la creazione? (ad esempio shape = new PolygonShape(); etc; fixtureDef.shape = shape; shape.dispose();). Stai creando nuove trame ovunque che non ti servono e non disponi? ecc. –
risposta aggiornata ragazzi – Luke