IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Limiter le FPS d'une application


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 115
    Par défaut Limiter le FPS d'une application
    Bonjour,

    Je poste ici car mon problème est plus d'ordre général (je pense) que porté sur Android

    Je travail actuellement sur un projet de jeux sous android avec un moteur à particules.
    J'ai la net impression que n'ayant pas limité le fps cela me cause quelques problèmes.
    L'année dernière j'ai travailler sur un jeu sous J2ME et le fait de ne pas limiter les cycles par seconde faisait que les touches du clavier ne répondaient pas assez rapidement.
    Pour cela mon prof m'avais conseiller d'endormir le thread si j'avais déja fait mes 50 cycles par secondes, ce qui avait trés bien fonctionné. Cependant je ne suis pas sur que c'était la meilleure solution.
    voila la methodes qu'il m'avait proposé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        private  static final int MAX_CPS = 50;
        private  static final int MS_PER_FRAME = 1000 / MAX_CPS;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public void run()
    {
    long cycleStartTime = System.currentTimeMillis();
    /************************************/
    /*Engine.update();*/
    /*Engine.draw();*/
    /************************************/
     
    long timeSinceStart = (cycleStartTime - System.currentTimeMillis());
          if (timeSinceStart < MS_PER_FRAME)
          {
               try
               {
                   Thread.sleep(MS_PER_FRAME - timeSinceStart);
                }
                catch(java.lang.InterruptedException e)
                {}
                }
    }
    Toujours est t-il que je n'arrive pas a l'implémenter cette solution de la même façon sous Android.
    Ce qui mis la puce à l'oreille est que si je fais tourner mon programme pas par pas(en debug) tout les les sprites s'affichent correctement, mais si je laisse tourner mon programme normalement seulement 3/10 s'affiche en moyenne.

    Comment peut on implémenter un système permettant de limiter le FPS (mieux que le CPS) de façon propre ? sachant que mon moteur tourne dans une boucle draw incluse dans un thread ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Tu as un problème avec la soustraction du currentTimeMillis();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    long cycleStartTime = System.currentTimeMillis();
    /************************************/
    // Processus long et couteux, System.currentTimeMillis() augmente
    /*Engine.update();*/
    /*Engine.draw();*/
    /************************************/
     
    long timeSinceStart = (cycleStartTime - System.currentTimeMillis());
    // Un nombre moins un nombre plus grand donne un nombre négatif
     
     
     if (timeSinceStart < MS_PER_FRAME)
    // un nombre négatif est TOUJOURS inférieur à 50.
          {
               try
               {
                   Thread.sleep(MS_PER_FRAME - timeSinceStart);
                   // Un nombre positif duquel on soustrait un nombre négatif donnera un nombre plus grand, donc dans ce cas-ci un sleep plus important !
                }
                catch(java.lang.InterruptedException e)
                {}
                }
    }
    En gros, pour corriger ces erreurs, il suffit simplement de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long timeSinceStart = (System.currentTimeMillis() - cycleStartTime);

Discussions similaires

  1. limiter cpu pour une application
    Par sboffin dans le forum Administration
    Réponses: 11
    Dernier message: 27/07/2009, 21h19
  2. Limitation de mot de passe avec une application
    Par pascal_T dans le forum Administration
    Réponses: 2
    Dernier message: 08/09/2008, 10h34
  3. limiter le nombre d'usagers simultanés d'une application
    Par hottnikks_79 dans le forum Access
    Réponses: 4
    Dernier message: 18/02/2007, 16h35
  4. [VB6] Comment faire pour limiter l'utilisation d'une application
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/06/2006, 08h43
  5. Limites d'access sur une application WEB
    Par titou250 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 07/04/2006, 02h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo