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

Lazarus Pascal Discussion :

Vitesse de déplacement d'un composant [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut Vitesse de déplacement d'un composant
    Bonjour à tous.

    Je fais un déplacement pixel par pixel d'un composant (un simple TPaintBox 20/20 avec dessin d'un rectangle).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
      i: integer;
    begin
       for i:= 1 to 1000 do
       begin
         Paintbox1.Left:= i;
         Application.ProcessMessages;
         Sleep(1);
       end;
       Beep;
    end;
    Il faut 16 secondes pour parcourir les 1000 pixels (bien que le Sleep = 1 ms).
    L'utilisation d'un Timer donne la même chose.

    1000/16 = environ 60 images/seconde, ce qui correspond à la fréquence de mon écran (60Hz).
    Ok, mais le même test avec le PaintBox rendu invisible prend aussi 16 secondes !!!
    L'événement OnPaint n'est plus appelé (normal), et il me semble que le taux de rafraichissement écran-carte graphique ne devrait plus jouer.

    Pouvez-vous me fournir une explication ?

    Merci d'avance.
    Cordialement
    Thierry

    PS: Lazarus v1.2.6 sous Windows7

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Salut,
    Citation Envoyé par ThWilliam Voir le message
    Pouvez-vous me fournir une explication ?
    non, car même en exécutant dans l'ide je suis loin des 16 secondes.

    Je n'ai pas compté précisément, mais 16 secondes c'est loooooooooooooooooooooooong !

    [EDIT] Je viens de mesurer : 1,3 sec avec ton code, 30 msec avec ma modif ci-dessous
    Et respectivement 1,07 sec et 1 msec avec le composant non visible [/EDIT]

    Ceci étant dit, pour speeder les choses, tu peux modifier ton code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         if (i mod 20 = 0) then // ajout !
           Application.ProcessMessages;
         //Sleep(1);
    Le résultat est quasi instantané, alors si tu veux voir ton composant se déplacer, va falloir adapter

  3. #3
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Salut Jipété,

    Merci pour ta réponse.

    En enlevant le Sleep(1) et sans mettre ton code if (i mod 20 = 0), le résultat est quasi instantané.
    D'où l'obligation de "ralentir" de 1ms pour voir le déplacement. Mais de là à passer à 16 secondes !!!
    Le but du jeu, c'est évidemment que je veux voir le composant se déplacer et de la manière la plus fluide possible.
    Avec un Sleep(1), tu arrives à 1,3 sec !!?
    J'ai pourtant un ordi performant, alors peut-on parler de miracle Linux ?
    Je ne l'explique que par un "saut" dans l'affichage (un affichage tous les x pixels).

    Cordialement
    Thierry

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    hello,
    petite question à jipété : tu avais des graphiques dans la paintbox ?

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    petite question à jipété : tu avais quelque chose de dessiner dans la paintbox ?
    PaintBox de 33 x 33, code trouvé dans un wiki quelconque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
      // set the brush color to the TPaintBox.Color
      PaintBox1.Canvas.Brush.Color := PaintBox1.Color;
      // and fill the background by yourself
      PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
      // and then draw an ellipse
      PaintBox1.Canvas.Brush.Color := clGreen;
      PaintBox1.Canvas.Ellipse(0, 0, 20, 20);
    end;

  6. #6
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    @ Jipété,

    J'ai repris exactement ton code (dans lequel je vois que tu as supprimé le Sleep(1)), y compris ta procedure Paint.

    Résultats :
    1) Sans le Sleep de 1ms :
    * avec le i mod 20 : entre 0 et 15 ms
    * sans le i mod 20 : 75 ms
    2) Avec le Sleep de 1ms :
    * avec le i mod 20 : 10 secondes
    * sans le i mod 20 : 10 secondes.

    Donc je reformule ma question :
    Comment se fait-il qu'en ajoutant une temporisation de 1ms ( soit 1 seconde pour la boucle de 1000), l'on passe de 75 ms à 10 secondes ?

    Cordialement
    Thierry

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Avec un Sleep(1), tu arrives à 1,3 sec !!?
    J'ai pourtant un ordi performant, alors peut-on parler de miracle Linux ?
    Et moi une vieille rougne de 5/6 ans environ, 4 gig de mem et un proc double cœur à 3 GHz.

    Voilà comment j'ai joué :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: integer;
      starttime,endtime: integer;
    begin
       starttime:=getTickCount;
       for i:= 1 to 1000 do
       begin
         Paintbox1.Left:= i;
         if (i mod 20 = 0) then
           Application.ProcessMessages;
         //Sleep(1);
       end; 
       Beep;
       endtime:=getTickCount-starttime;
       caption := inttostr(endtime);
    end;

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bon.

    Ben, sans vouloir te chasser, mais peut-être que tu devrais poster dans le forum Delphi, parce que le code c'est du bête Pascal et l'OS qui se traîne c'est ouinouin, donc Pascal + ouinouin >>> Delphi

    Sinon, si tu le sens, tu fais un exe 32 bits avec 2 Checkbox (une pour prendre en compte ou pas (i mod 20), l'autre pour le sleep(1)) et je pourrai tester dans ma VM XP.

    Pas d'autre idée...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment limiter le déplacement d'un composant ?
    Par scara dans le forum Composants VCL
    Réponses: 10
    Dernier message: 06/12/2007, 18h29
  2. vitesse de déplacement d'une image pas constante
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 11/04/2006, 13h32
  3. [Image] scintillement lors déplacement sur autre composant
    Par lilou77 dans le forum Interfaces Graphiques en Java
    Réponses: 21
    Dernier message: 07/12/2005, 09h27
  4. Déplacement dynamique de composants à l'exécution
    Par tekilx dans le forum Composants VCL
    Réponses: 8
    Dernier message: 05/07/2005, 10h46
  5. [debutant][c++] Problème de vitesse de déplacement
    Par bornibus dans le forum OpenGL
    Réponses: 15
    Dernier message: 26/02/2005, 09h16

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