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

  1. #1
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    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
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    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 éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    petite question à jipété : tu avais des graphiques dans la paintbox ?
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    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;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    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;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    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

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello ThWilliam,
    il me semble que sous windows le temps minimal d'un Sleep est de 10 ms et lorsque l'on met une valeur inférieure on se retrouve avec ce temps. Pour vérifier met des valeurs de 2, 3 etc .... pour voir si tu as les mêmes timing.
    Cela vient du fait que windows n'est pas un 0.S temps réel.
    Pour confirmer : Jipété tu es sous windows ou linux ?
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    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...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Pour confirmer : Jipété tu es sous windows ou linux ?
    Linux 32 bits.

    Rhôôô, ça fait deux fois sur ce fil que tu postes pendant que je rédige,

    Citation Envoyé par jurassic pork Voir le message
    il me semble que sous windows le temps minimal d'un Sleep est de 10 ms...
    Et 1000 fois 10 msec ça fait 10 sec !
    CQFD ?

    [EDIT]
    In my experience, if you set dwMilliseconds to a value greater than 0 but less than one tick (e.g. Sleep(1), the thread will sleep for at least one tick. So if one tick is 1/64 second (15.625ms), and you Sleep(1);, your thread will (in my experience) sleep for at least 15.625ms.
    Tout en bas de la page officielle
    La messe est dite, fermez le ban ! [/EDIT]
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    @ 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
    Bonjour,

    J'ai fait des tests avec LazPro qui est autrement plus fin et fiable qu'un compteur ajouté dans du code.
    A priori, le problème ne vient pas que de sleep ou de paint : il viendrait aussi (surtout ?) de ProcessMessages qui mange 70% du temps.
    Déjà, dans Delphi, il est recommandé depuis longtemps de ne pas utiliser ProcessMessages qui est une procédure très vorace en ressources et de rechercher une solution autre. Par exemple, dans ton code, il n'est pas sans doute pas judicieux que tout ton programme soit bloqué tandis qu'un triangle se déplace à l'écran.

    Je vais poursuivre mes recherches
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  12. #12
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    Par défaut
    Salut JP.
    Bien vu
    Je viens de tester une boucle de 1 à 1000 avec uniquement un sleep(1) : cela prend 10 secondes ! Bravo Windows !
    Voilà, j'imagine, pourquoi mes essais avec un TTimer < 10ms n'accélérait pas le déplacement.
    Merci à toi.

    Re-salut Jipété.
    Merci pour le lien msdn.
    Après de longues années sous Delphi, tu veux m'y renvoyer ???

    Cordialement
    Thierry

  13. #13
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    Par défaut
    Salut Gilles,

    Merci pour ton intervention.
    En fait, je ne bloque pas mon programme pendant le déplacement. J'utilise un TTimer. Et j'étais étonné de ne pas voir d'accélération du déplacement avec un interval < 10ms.
    D'où mes tests avec la fonction Sleep dans une simple boucle.

    Cordialement
    Thierry

  14. #14
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    Au fait à titre indicatif si ton but est de créer des objets, graphiques animés tu devrais regarder du côté de Asphyre qui utilise des technologies plus appropriées pour le déplacement d'objet (par exemple directx pour windows). La bibliothèque est disponible pour delphi et free pascal/Lazarus. Je viens d'essayer un exemple (le basic qui déplace un trou et fait d'autres animations) , sous Lazarus 1.4 windows, cela fonctionne.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  15. #15
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    Au fait à titre indicatif si ton but est de créer des objets, graphiques animés tu devrais regarder du côté de Asphyre qui utilise des technologies plus appropriées pour le déplacement d'objet (par exemple directx pour windows). La bibliothèque est disponible pour delphi et free pascal/Lazarus. Je viens d'essayer un exemple (le basic qui déplace un trou et fait d'autres animations) , sous Lazarus 1.4 windows, cela fonctionne.

    Ami calmant, J.P
    @ JP

    Bonjour itou,

    A titre aussi indicatif, je te suggère un tour vers Castle engine que tu connais peut-être déjà. Le problème avec Asphyre est que le projet semble abandonné alors que Castle est en plein développement. De plus, le projet est dédié à Lazarus. Peut-être est-il un peu lourd à digérer...

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  16. #16
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour JP & Gilles.

    Merci pour les pistes. Je vais regarder cela de plus près.

    Bonne journée.

    Cordialement
    Thierry

    PS: je considère cette discussion résolue.

+ 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