Optimización de los efectos de partículas para teléfonos más lentos

Estoy haciendo un juego libGDX que usa efectos de partículas para explosiones. Esto funciona bastante bien en los teléfonos nuevos, pero en los teléfonos más antiguos (probado en el HTC Desire) cuando hay más de unas pocas explosiones en la pantalla fps retrasa bastante significativamente.

Hay dos opciones que estoy considerando actualmente:

  1. Hay un montón de partículas por efecto, por lo que la reducción de ese recuento puede ser una opción, pero yo preferiría no por coherencia y razones estéticas.

  2. Utilizar una animación generada al ejecutar el efecto de partícula y guardar cada fotograma. Esto parecería agradable y sería consistente. Puede haber problemas con el tamaño de la imagen. También no puedo ver cómo esto se puede hacer con la aplicación de la partícula libGDX.

¿Algunas ideas?

EDIT: Algunos fragmentos del código: Después de cargar el efecto en la clase Activos:

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

Cargo el efecto de partícula en el constructor del objeto de proyectil. Estoy haciendo esta creación de objetos en el bucle de renderización principal que sé es un candidato para la optimización.

  explosion = new ParticleEffect(Assets.particleFire); 

En el subproceso de renderizado se llama a este método para dibujar los efectos.

  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 fragmento de explosión.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: Estos efectos son aditivos por lo que hay un buen poco de mezcla pasando también.

Mirando ambas ideas, ambas funcionarán. La primera podría resolverse haciendo las partículas un poco más grandes y usando menos de ellas. Las partículas menos que el teléfono tiene que procesar mejor a medida que cada partícula se mueve dinámicamente y, por tanto, muchos cálculos por marco de garrapata.

Su segunda opción me parece que sería mejor, ya que no hay / poco tiempo de procesamiento (simplemente calcular hasta qué punto a través de la "explosión" que era y la selección de la estructura adecuada.También hay también el comercio de que todas sus explosiones se verá muy similar .Si pudieras publicar parte de tu código (cuántas partículas estás usando, con qué frecuencia se producen las explosiones, aproximadamente cuántas explosiones están ocurriendo simultáneamente) eso sería útil.Tuve un problema similar hace un tiempo, pero con una forma mucho más simple Efecto de la partícula y lo resolví apenas haciendo un efecto de la partícula y moviéndolo a por todas partes que se estaba mostrando cada marco

Editar 1: Ok, así que creo que lo que estás buscando es una piscina de efectos de partículas. Básicamente, asignar un número determinado de efectos de partículas de antemano en lugar de crearlos como sea necesario, como creo que puede tener. Al reutilizar objetos de una agrupación fija en lugar de asignarlos y liberarlos individualmente, puede ahorrar mucha memoria y procesamiento. He intentado lo que creo que has hecho en mi Desire HD y obtuvo cerca de 22 fps con 12, 1 segundo 100 efectos de partículas impares en la pantalla a la vez. A continuación, la puesta en común que tengo alrededor de 25. No es exactamente sorprendentemente bueno, pero cada poco ayuda. También reducir el conteo de partículas incluso a alrededor del 75% no es todo lo que se nota y le ahorra un montón de cuadros!

Pool de efectos de partículas Libgdx JavaDoc

Lo siento, no pude ayudar más!

  • No se puede ejecutar el proyecto en Android Studio (libGDX)
  • Dibujo de una forma transparente en libGDX como actor?
  • NoOptions no se puede resolver con un tipo
  • Píxeles a las inmersiones, al escritorio y al android
  • Dibujo ShapeRenderer transparente en libgdx
  • ¿Cómo comprobar la intersección en libgdx?
  • La imagen no es un poder de 2?
  • Libgdx MainMenuScreen
  • NullPointerExceptions sólo en algunos dispositivos Samsung Galaxy?
  • ¿Cómo funcionará touchDragged en libgdx?
  • Cómo dibujar un bitmapfont en una etapa en libgdx?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.