2012-11-05 2 views
6

Realizzo un gioco libGDX che utilizza effetti particellari per le esplosioni. Funziona piuttosto bene con i nuovi telefoni, ma con i telefoni più vecchi (testati su HTC Desire) quando ci sono più di un paio di esplosioni sui fps dello schermo in modo abbastanza significativo.Ottimizzazione degli effetti particellari per i telefoni più lenti

ci sono due opzioni attualmente sto valutando:

  1. Ci sono un sacco di particelle per effetto riducendo così che conta può essere un'opzione, ma preferirei non per la coerenza e ragioni estetiche.

  2. Utilizzo di un'animazione generata dall'esecuzione dell'effetto particella e salvataggio di ciascun fotogramma. Questo sarebbe bello e sarebbe coerente. Potrebbero esserci problemi con le dimensioni dell'immagine. Inoltre non riesco a vedere come questo possa essere fatto con l'implementazione delle particelle libGDX.

Qualche idea?

EDIT: Alcuni frammenti di codice: Dopo aver caricato l'effetto nella classe Assets:

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

carico l'effetto particella nel costruttore dell'oggetto proiettile. Sto facendo questa creazione di oggetti nel ciclo di rendering principale che so essere un candidato per l'ottimizzazione.

   explosion = new ParticleEffect(Assets.particleFire); 

Nel thread di rendering questo metodo viene chiamato per disegnare gli effetti.

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); 


    } 
    } 

} 

Un frammento di 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: Questi effetti sono additivi quindi c'è una buona punta di miscelazione corso troppo.

risposta

3

Guardando entrambe le vostre idee, avrebbero entrambi funzionato. Il primo potrebbe essere risolto rendendo le particelle leggermente più grandi e usando meno di esse. Il minor numero di particelle che il telefono deve elaborare è migliore di ogni particella si muove in modo dinamico e quindi molti calcoli per fotogramma tick.

La seconda opzione che ritengo sarebbe migliore, in quanto non vi è alcuno/minimo tempo di elaborazione (semplicemente calcolando quanto lontano attraverso "l'esplosione" era e selezionando il frame appropriato.) Tuttavia c'è anche il trade off che tutte le vostre esplosioni sembrerà molto simile Se potessi pubblicare parte del tuo codice (quante particelle stai usando, quanto spesso accadono esplosioni, all'incirca quante esplosioni accadono simultaneamente) sarebbe utile. Ho avuto un problema simile qualche tempo fa, ma con un effetto particella molto più semplice e ho risolto semplicemente rendendo un effetto particella e spostandolo ovunque che veniva mostrato ogni frame

Edit 1: Ok, così che quello y stai cercando è un pool di effetti particellari. Fondamentalmente si assegna in anticipo un determinato numero di effetti particellari invece di crearli secondo le necessità che ritengo possano avere. Riutilizzando oggetti da un pool fisso invece di allocarli e liberarli singolarmente è possibile risparmiare molta memoria ed elaborazione. Ho provato quello che credo che hai fatto sul mio Desire HD e ho ottenuto circa 22 fps con 12, 1 secondo 100 effetti di particelle dispari sullo schermo in una sola volta. Poi li ho riuniti circa 25. Non è esattamente scandalosamente buono, ma ogni piccolo aiuto.Anche ridurre il conteggio delle particelle anche a circa il 75% non è poi così evidente e ti risparmia un sacco di fotogrammi!

Particle Effect Pool Libgdx JavaDoc

Siamo spiacenti, non ho potuto fare di più!

+0

Ho aggiornato l'OP. Ci sono alcune ovvie ottimizzazioni con la creazione di oggetti di cui sono a conoscenza, ma non penso che siano il problema. Il frame rate inizia a diventare un problema a 8 o 9 sugli effetti dello schermo con una galaxy Samsung. Circa 5 su HTC Desire. – barconr

+0

Ho aggiornato il mio OP – LiamJPeters