Andengine FPS bajo en ciertos teléfonos

Mi juego funciona bien en la mayoría de los teléfonos (56 FPS), pero otros ejecutan el juego a ~ 25 FPS. En mi juego tengo 3 sistemas de partículas y por lo que puedo decir el problema viene de aquí. Mi pregunta: ¿Es una buena idea detener el desove de partículas si detecto FPS más bajo que, digamos 30? Y si el FPS es más alto simplemente corre con normalidad. No estoy seguro de si esto puede causar problemas. hay alguna otra solucion?

Puedo pensar en varias cosas que puedes hacer para ayudar a aliviar este problema.

Usted podría utilizar su método para detectar el fps y entonces caer los sistemas de la partícula si es necesario. Sin embargo, usted no tiene que votarlo cada segundo – usted podría hacerlo una vez cada diez segundos o tan. Si tienes una velocidad de fotogramas baja, entonces sabes que el teléfono va a sufrir de vez en cuando, así que ya no necesitas hacer más sondeos, puedes bajar las partículas y detener las encuestas.

O bien, puede utilizar el método de sondeo con varios "niveles" de efectos de partículas, por lo que si no puede manejar el nivel superior, suelte el siguiente nivel de complejidad, y así sucesivamente.

Además, incluso se puede permitir al usuario ajustar manualmente los efectos de partículas, es decir, en un menú de opciones que les permita cambiarlos a un ajuste bajo o algo así.

Tal vez también podría perfil devies en tiempo de ejecución, es decir, cuántos núcleos, chips gráficos etc y ajustar en consecuencia.

Asegúrese de que sus partículas están optimizadas etc, por lo que no tienen tamaños de textura innecesarios cuando podrían ser más pequeño, etc, pero estoy seguro de que probablemente has hecho esto!

Le sugeriría ejecutar todas las características gráficas de su juego, cuando se puede renderizar a 30 fotogramas por segundo. Si ve una velocidad de fotogramas inferior a 30, debe desactivar gráficos no vitales, por ejemplo. Partículas.

Intenta establecer "android: theme =" @ style / Theme.NoBackground "para tu actividad en el manifiesto. Es apagar la redering de fondo del sistema.

No forjar para crear theme.xml:

<?xml version="1.0" encoding="UTF-8"?> <resources> <style name="Theme.NoBackground" parent="android:Theme"> <item name="android:windowBackground">@null</item> </style> </resources> 

Intente saltar cuadros si la tarifa de marco consigue más baja, pero no salte demasiados marcos de otra manera dará lugar a la experiencia pobre del usuario. A continuación se muestra el código para determinar si el subproceso se ejecuta a tiempo, si no, saltará los marcos (no más de 5):

 // desired fps private final static int MAX_FPS = 50; // maximum number of frames to be skipped private final static int MAX_FRAME_SKIPS = 5; // the frame period private final static int FRAME_PERIOD = 1000 / MAX_FPS; // number of frames skipped since the game started private long totalFramesSkipped = 0l; // number of frames skipped in a store cycle (1 sec) private long framesSkippedPerStatCycle = 0l; // number of rendered frames in an interval private int frameCountPerStatCycle = 0; private long totalFrameCount = 0l; // the last FPS values private double fpsStore[]; // the number of times the stat has been read private long statsCount = 0; // the average FPS since the game started private double averageFps = 0.0; long beginTime; // the time when the cycle begun long timeDiff; // the time it took for the cycle to execute int sleepTime; // ms to sleep (<0 if we're behind) int framesSkipped; // number of frames being skipped sleepTime = 0; beginTime = System.currentTimeMillis(); framesSkipped = 0; // resetting the frames skipped // calculate how long did the cycle take timeDiff = System.currentTimeMillis() - beginTime; // calculate sleep time sleepTime = (int)(FRAME_PERIOD - timeDiff); if (sleepTime > 0) { // if sleepTime > 0 we're OK try { // send the thread to sleep for a short period // very useful for battery saving Thread.sleep(sleepTime); } catch (InterruptedException e) {} } while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) { // we need to catch up this.gamePanel.update(); // update without rendering sleepTime += FRAME_PERIOD; // add frame period to check if in next frame framesSkipped++; } 

Hazme saber si esto funciona.

  • Cómo utilizar AsyncTask clase para actualizar el progreso de copiar un archivo de otro directorio?
  • Android: Lectura desde un archivo (Openfileinput)
  • ¿Por qué se llama a mi onResume dos veces?
  • Cómo ajustar el tamaño de los desplegables de azulejos
  • ¿Cómo establecer un hipervínculo en textview clicable? Android Java
  • Cómo leer / interceptar mensaje USSD que viene en el teléfono Android
  • En java, ¿cómo puedo eliminar una tabla sqlite?
  • Declaración de variables de botón como una matriz con un bucle for android
  • Fragmentos anidados - IllegalStateException "No se puede realizar esta acción después de onSaveInstanceState"
  • Cómo implementar la funcionalidad de deshacer en opengl en android
  • Android MediaPlayer toma mucho tiempo para preparar y almacenar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.