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

Android Discussion :

calculer la vitesse de calcul


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut calculer la vitesse de calcul
    Bonjour,

    Je réalise un petit jeux 2D, et je constate que la vitesse de certains éléments n'est pas parfaitement constante....J'en conclu qu'il sagit sans doute de la vitesse de calcul qui évolu. J'aimerais donc pouvoir calculer ce temps de calcul pour l'utiliser en tant que facteur pour la vitesse.

    Mon code donne ceci :

    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
    25
     
            while (running)
            {
                    startTime = System.currentTimeMillis();
                    synchronized (view.getHolder()){view.update();}
                    Canvas c = null;
                    try
                    {
                        c = view.getHolder().lockCanvas();
                        synchronized (view.getHolder()){view.doDraw(c);}
                    }
                    finally
                    {
                        if(c != null){view.getHolder().unlockCanvasAndPost(c);}
                    }
                    sleepTime = SKIP_TICKS-(System.currentTimeMillis()-startTime);
                    try
                    {
                        if (sleepTime >= 0)
                        {
                            sleep(sleepTime);
                        }
                    }
                        catch (Exception e){}
                }
    Merci si vous pouvez m'aider.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Re bonjour,

    J'ai ajouté une valeur pour calculer le temps, mais le résultat me paraît trop aproximatif : lorsque je lance mon programme sur l'émulateur, les éléments avancent a une vitesse raisonable, mais quand je le test sur mon smartphone, ils fusent a toute allure.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    public class GameLoop extends Thread {
     
        private final static int FRAMES_PER_SECOND = 30 ;
        private final static int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;
        private final GameContent view;
        private boolean running = false;
        private double timer = 0 ;
     
        public GameLoop(GameContent view)
        {
            this.view = view;
        }
     
        public void setRunning(boolean run)
        {
            running = run;
        }
     
        @Override
        public void run(){
            long startTime;
            long sleepTime;
     
            while (running)
            {
                startTime = System.currentTimeMillis();
     
                Canvas c = null;
                try
                {
                    c = view.getHolder().lockCanvas();
     
                    double time = System.currentTimeMillis() - timer ;
                    synchronized (view.getHolder()){view.draw( c , time );}
                    timer = System.currentTimeMillis();
                }
                finally
                {
                    if(c != null){view.getHolder().unlockCanvasAndPost(c);}
                }
                sleepTime = SKIP_TICKS-(System.currentTimeMillis()-startTime);
                try
                {
                    if (sleepTime >= 0)
                    {
                        sleep(sleepTime);
                    }
                }
                catch (Exception e){}
            }
        }
    }
    S.V.P, savez vous comment faire pour gérer une vitesse stable des élements ?

    Merci si vous pouvez m'aider.

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Le sleep est à éviter à tout prix dans un programme... il y a beaucoup d'autres moyen de synchroniser à une heure donnée une action.

    D'autre part, Android n'étant pas un OS temps réel (ils sont rares ces OS, et chers ), rien ne dit que la boucle fera le temps donné.


    En général on fait l'inverse dans un moteur de jeu... à chaque fois qu'on entre dans la boucle, on regarde le temps qui s'est écoulé depuis la dernière fois.
    Ce temps permet de calculer le déplacement des objets en fonction de leur vitesse....

    Si on compte la vitesse en "pixel / seconde", on aura un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    long currentTime = System.nanoTime(); // <= bien plus précis que currentTimeMillis
    float seconds = (currentTime - this.lastTime) / 1000000000.0; // <= converting to seconds.
    this.lastTime = currentTime; // <= il est posssible de faire aussi une "moyenne" sur les deux ou trois derniers frames pour éviter le stuttering
     
    /// ici on a un object qui se déplace avec une vitesse dans "PointF  celerity;" et une position précédente (en pixels) de "PointF lastPos;"
    // d'abord faire la gestion des collisions (l'objet se déplacant risque-t-il de collider avec un autre objet se déplacant) pendant ce temps. En profiter pour mettre à jour les accelerations
    // puis effectuer le mouvement des objets (la "physique")... genre:
    lastPost.x += celerity.x * seconds;
    lastPost.y += celerity.y * seconds;
    celerity.x += acceleration.x * seconds;
    celerity.y += acceleration.y * seconds;
    // enfin effectuer l'affichage de tout.
    Normalement, que la boucle prenne un demi seconde ou 1/100eme de seconde, peu importe.....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Merci beaucoup, Nicroman !

    J'a adopté cette méthode, c'est effectivement plus logique et ça semble bien fonctionner.

    En revanche j'ai tout de même besoin de pouvoir calculer le temps pour des compteurs, ce d'un façon précise.
    Connaissez vous la meilleur façon de faire ?

Discussions similaires

  1. Calcul de vitesse d'une dendrite
    Par donutsk8r dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 12/07/2009, 20h19
  2. Calculer la vitesse d'un moteur
    Par nem007 dans le forum LabVIEW
    Réponses: 13
    Dernier message: 30/03/2009, 18h23
  3. probleme avec la vitesse du calcul
    Par kroma23 dans le forum Débuter
    Réponses: 6
    Dernier message: 23/10/2008, 19h17
  4. imbrication de tables dérivées et vitesse de calcul
    Par tinomulot dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 19/09/2008, 16h15
  5. macro pour calculer la vitesse d'execution d'une macro
    Par victorzecat dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 08/12/2007, 14h34

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