Andengine faible FPS sur certains téléphones

Mon jeu fonctionne bien sur la plupart des téléphones (56 FPS), mais d’autres fonctionnent à environ 25 FPS. Dans mon jeu, j’ai 3 systèmes de particules et, autant que je sache, le problème vient de là. Ma question: Est-ce une bonne idée de cesser de générer des particules si je détecte un FPS inférieur à 30, par exemple? Si le FPS est plus élevé, exécutez-le normalement. Je ne sais pas si cela peut causer des problèmes. N ‘y a-t-il pas une autre solution?

Je peux penser à plusieurs choses que vous pouvez faire pour aider à résoudre ce problème.

Vous pouvez utiliser votre méthode pour détecter les images par seconde, puis abandonner les systèmes de particules si nécessaire. Cependant, vous n’avez pas à le consulter toutes les secondes, vous pouvez le faire toutes les dix secondes environ. Si vous avez un taux de trame faible, vous savez alors que le téléphone va en souffrir de temps en temps. Vous n’avez donc plus besoin d’interroger, vous pouvez réduire les particules et arrêter l’interrogation.

Vous pouvez également utiliser la méthode d’interrogation avec plusieurs “niveaux” d’effets de particules. Ainsi, si elle ne parvient pas à gérer le niveau supérieur, supprimez le niveau de complexité suivant, etc.

En outre, vous pouvez même permettre à l’utilisateur de régler manuellement les effets de particules, c’est-à-dire, dans un menu d’options, de lui permettre de passer à un réglage bas ou quelque chose de ce genre.

Peut-être pourriez-vous également profiler les développeurs à l’exécution, c’est-à-dire combien de cœurs, de puces graphiques, etc. et ajuster en conséquence.

Assurez-vous que vos particules sont optimisées, etc., de manière à ne pas avoir des tailles de texture inutiles car elles pourraient être plus petites, etc., mais je suis sûr que vous l’avez probablement déjà fait!

Je suggérerais que vous exécutiez toutes les fonctionnalités graphiques de votre jeu, lorsqu’il peut être rendu à plus de 30 images par seconde. Si vous voyez une cadence d’images inférieure à 30, désactivez les graphiques non vitaux, par exemple. les particules.

essayez de définir “android: theme =” @ style / Theme.NoBackground “pour votre activité dans manifest. sa désactivation du redering en arrière-plan du système.

ne pas forger pour créer theme.xml:

    

Essayez de sauter des images si la cadence est plus basse, mais ne sautez pas trop d’images, sinon l’expérience utilisateur serait médiocre. Voici le code pour déterminer si le thread s’exécute à l’heure, sinon il sautera des images (pas plus 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++; } 

Laissez-moi savoir si cela fonctionne.