2012-11-05 6 views
6

Ich mache ein libGDX-Spiel, das Partikeleffekte für Explosionen verwendet. Das läuft auf neuen Handys recht gut, aber auf älteren Handys (getestet auf dem HTC Desire), wenn es mehr als ein paar Explosionen auf dem Bildschirm gibt, liegen die fps ziemlich weit zurück.Partikeleffekte für langsamere Telefone optimieren

Es gibt zwei Optionen, die ich zur Zeit bin Berücksichtigung

  1. viele Teilchen pro Effekt Es gibt so die zählen zu reduzieren kann eine Option sein, aber ich möchte lieber nicht auf Konsistenz und ästhetischen Gründen.

  2. Verwenden einer Animation, die durch Ausführen des Partikeleffekts und Speichern der einzelnen Frames generiert wird. Das würde gut aussehen und wäre konsistent. Es können Probleme mit der Bildgröße auftreten. Ich kann auch nicht sehen, wie dies mit der libGDX-Partikelimplementierung gemacht werden kann.

Irgendwelche Ideen?

EDIT: Einige Schnipsel des Codes: Nachdem die Wirkung in der Assets Klasse Laden:

particleFire.load(Gdx.files.internal("explosion.p"),Gdx.files.internal("")); 

lade ich den Partikeleffekt im Konstruktor des Projektils Objekts. Ich mache diese Objekterstellung in der Hauptrendering-Schleife, von der ich weiß, dass sie ein Kandidat für die Optimierung ist.

   explosion = new ParticleEffect(Assets.particleFire); 

Im Rendering-Thread wird diese Methode aufgerufen, um die Effekte zu zeichnen.

private void drawBlasts(float delta){ 

    for(Missile projectile : world.missiles){ 
    if (projectile.missileState == State.EXPLODING){ 

     if(projectile.stateTime==0.0f) { 
      projectile.explosion.start(); 
      continue; 
     } 

     projectile.explosion.setPosition(projectile.position.x, projectile.position.y); 
     projectile.explosion.draw(spriteBatcher, delta); 


    } 
    } 

} 

Ein Ausschnitt von explosion.p

- Delay - 
active: false 
- Duration - 
lowMin: 1000.0 
lowMax: 1000.0 
- Count - 
min: 0 
max: 100 
- Emission - 
lowMin: 0.0 
lowMax: 0.0 
highMin: 250.0 
highMax: 250.0 
relative: false 
scalingCount: 1 
scaling0: 1.0 
timelineCount: 1 
timeline0: 0.0 
- Life - 
lowMin: 800.0 
lowMax: 800.0 
highMin: 1000.0 
highMax: 1000.0 
relative: false 
scalingCount: 3 
scaling0: 1.0 
scaling1: 1.0 
scaling2: 1.0 
timelineCount: 3 
timeline0: 0.0 
timeline1: 0.66 
timeline2: 0.9931507 

EDIT 2: Diese Effekte additiv sind, so gibt es ein gutes Stück des Mischens zu geht.

Antwort

3

Mit Blick auf beide Ihrer Ideen würden sie beide funktionieren. Die erste könnte gelöst werden, indem man die Partikel etwas größer macht und weniger davon verwendet. Je weniger Partikel das Telefon verarbeiten muss, desto besser ist es, wenn sich jedes Partikel dynamisch bewegt und somit viele Berechnungen pro Frame ausgeführt werden.

Ihre zweite Option, die ich fühle, wäre besser, da es keine/wenig Verarbeitungszeit gibt (einfach berechnen, wie weit durch die "Explosion" war und den entsprechenden Rahmen auswählen. Allerdings gibt es auch den Trade all Ihrer Explosionen Wenn Sie etwas von Ihrem Code veröffentlichen könnten (wie viele Partikel Sie verwenden, wie oft Explosionen passieren, ungefähr wie viele Explosionen gleichzeitig stattfinden), wäre das hilfreich. Ich hatte vor einer Weile ein ähnliches Problem, aber mit einer viel einfacheren Wirkung Partikel und ich es gelöst, indem nur Rendering eines Partikel-Effekt und es überall zu bewegen, dass sie jeden Rahmen

Edit 1 gezeigt wurde: Ok, also denke ich, was y Sie suchen nach einem Partikeleffekt-Pool. Sie ordnen im Voraus eine bestimmte Anzahl von Partikeleffekten zu, anstatt sie nach Bedarf zu erstellen. Indem Sie Objekte aus einem festen Pool wiederverwenden, anstatt sie einzeln zuzuweisen und freizugeben, können Sie viel Speicher und Verarbeitungsaufwand sparen. Ich habe versucht, was ich glaube, du hast auf meinem Desire HD getan und habe etwa 22 fps mit 12, 1 Sekunde 100 ungerade Partikeleffekte auf dem Bildschirm auf einmal. Dann sammelte ich ungefähr 25 Punkte. Es ist nicht gerade schockierend gut, aber jedes bisschen hilft.Auch die Verringerung der Partikelanzahl auf etwa 75% ist nicht so auffällig und erspart Ihnen VIELE Frames!

Particle Effect Pool Libgdx JavaDoc

Leider habe ich nicht mehr helfen könnte!

+0

Ich habe das OP aktualisiert. Es gibt einige offensichtliche Optimierungen bei der Objekterstellung, die mir bekannt sind, aber ich denke nicht, dass sie das Problem sind. Frame-Rate wird ein Problem bei 8 oder 9 auf Bildschirm-Effekte mit einem Samsung Galaxy s. Ca. 5 auf einem HTC Desire. – barconr

+0

Ich habe mein OP aktualisiert – LiamJPeters

Verwandte Themen