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

Composants FMX Delphi Discussion :

Problème lag TFloatAnimation sur TFrame


Sujet :

Composants FMX Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 15
    Points
    15
    Par défaut Problème lag TFloatAnimation sur TFrame
    Bonsoir le forum,

    J'espère que je suis dans la bonne section ?

    Je me casse les dents sur un problème d'animation depuis des jours sans trouver de solution alors je me résous à faire appel au forum. J'ai regardé l'aide et pas mal de tuto mais je ne trouve pas précisément ce que je cherche. Je trouve bien ce que chaque propriété fait mais pas concernant mon problème.

    J'utilise Delphi 12 Athens sur un Windows 11 Professionnel 23H2.

    J'ai un programme FMX (Desktop) avec un TForm principal. Dessus j'ai un TLayout et à l'intérieur je détruis et crée successivement des objets TFrame qui représentent différents écrans.

    Sur un de ces TFrame (écran) j'ai réalisé une animation avec 10 TArc qui est un peu la même chose qu'un curseur lorsque le programme attend longtemps quelque chose. Chaque TArc possède son propre TFloatAnimation où je joue avec 0..360 pour l'angle de rotation et en mode loop.

    Quand je lance ce programme comme ça et que je crée le TFrame spécifique avec l'animation de l'arc, ça va tout se passe bien ! Mais dès lors que j'ajoute des TTimers sur le TForm principal ou dans un autre TForm qui se trouve dans la section "uses" du TForm principal, les choses tournent mal ! En fait, l'animation semble laguer quelques microsecondes entre chaque loop de TFloatAnimation ce qui donne un rendu très approximatif et donne l'impression que l'application est bloquée ou défaillante. J'ai quand même l'impression que c'est lié aux timers car plus il y en a (j'en ai 5 au total) ou si le traitement du timer est un peu long (suivant le timer) alors le lag semble plus prononcé !

    Du coup je ne suis pas sûr de bien utiliser les animations !

    Quelqu'un a t-il déjà rencontré ce problème ? Peut-être que je n'ai pas toutes les informations ou que j'ai codé quelque chose de travers ? Je n’ai rien vu sur la documentation d’Embarcadero concernant ce point spécifique.

    Peut-être n'est-il pas possible d'utiliser TFloatAnimation sur un TFrame et/ou avec TTimers ? Peut-être faudrait-il que j'utilise TTask (parallelisation) ou que je threade mon application ? Mais avant de partir dans des délires de programmation qui vont me coûter du temps et peut-être générer une usine à gaz j'aimerais être sûr d'aller dans le bon sens ?

    Je vous serais reconnaissant si vous aviez la gentillesse de me faire part de vos commentaires ou d'une direction, un conseil ou un indice car je suis vraiment coincé là.

    Merci d'avance pour votre aide le forum.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par DelphiCode Voir le message
    J'espère que je suis dans la bonne section ?
    Non, il s'agit de FMX pas d'API, donc je l'ai déplacé
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Maintenant que le boulot de modérateur est fait (déplacement en bonne section), je peux m'attarder sur la demande.
    Citation Envoyé par DelphiCode Voir le message
    J'ai un programme FMX (Desktop) avec un TForm principal. Dessus j'ai un TLayout et à l'intérieur je détruis et crée successivement des objets TFrame qui représentent différents écrans.
    En bref, comme moi récemment, tu veux réinventer une roue, il a fallu que je sois à la retraite pour pouvoir le tester hélas, mais ce que tu tentes de faire, Andrea Magni et ses composants TFrameStand et TFormStand le propose déjà en beaucoup plus abouti.
    P.S. Il est dommage que suite aux problèmes récents des serveurs Embarcadero, ces composants ne soient plus sur Getit, il faudra un peu d'huile de coudes pour l'installation.

    Sur un de ces TFrame (écran) j'ai réalisé une animation avec 10 TArc qui est un peu la même chose qu'un curseur lorsque le programme attend longtemps quelque chose. Chaque TArc possède son propre TFloatAnimation où je joue avec 0..360 pour l'angle de rotation et en mode loop.
    as-tu pensé aux animations proposées par Skia (composant skanimatedimage) ? Cela étant, je n'y connais pas grand-chose en animation et en particulier sur les fichiers de type Lottie (il va falloir que je m'y mette).
    En tout cas cette histoires d'arcs me fait penser à une de ces animations que j'ai vu sur ce site
    https://cdnl.iconscout.com/lottie/pr...15-2897655.mp4


    Du coup, je ne suis pas sûr de bien utiliser les animations !
    ce n'est peut-être pas tant les animations que les timers qui posent problème(s) encore que, quand il y en a plusieurs, c'est toujours un problème délicat. Des utilisations de threads sont certainement à envisager et je vois que plus loin, tu te poses ces questions.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par DelphiCode Voir le message
    Bonsoir le forum,
    .../...
    Peut-être n'est-il pas possible d'utiliser TFloatAnimation sur un TFrame et/ou avec TTimers ? Peut-être faudrait-il que j'utilise TTask (parallelisation) ou que je threade mon application ? Mais avant de partir dans des délires de programmation qui vont me coûter du temps et peut-être générer une usine à gaz j'aimerais être sûr d'aller dans le bon sens ?
    .../...
    .
    Eviter d'utiliser en même temps TFloatAnimation avec Timer et TTask.
    Exemple qui fonctionne chez moi (Delphi 11)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
              object FloatAnimation1: TFloatAnimation
                AnimationType = InOut
                Duration = 3.000000000000000000
                Interpolation = Sinusoidal
                OnFinish = FloatAnimationFinish
                PropertyName = 'RotationAngle.Y'
                StartValue = 0.000000000000000000
                StartFromCurrent = True
                StopValue = 0.000000000000000000
              end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      FloatAnimation1.StopValue := (FloatAnimation1.StartValue + 720 + (Ar1[random(22)]));
      FloatAnimation3.Duration := 6;
    Noter le 720 pour deux tours. Utilisé dans un programme de demo. Dont je peux te fournir les sources si tu le souhaites
    Nom : Capture d'écran 2024-03-06 094259.png
Affichages : 168
Taille : 47,4 Ko

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Bonsoir le forum,

    Merci à vous 2 pour vos contributions c'est très appréciable

    @SergioMaster :

    • Merci pour la modération


    • Je n'avais pas entendu parlé des composants d'Andrea Magni mais la piste semble prometteuse. Cependant cela nécessiterait de revoir une bonne partie du design de mon application mais dans un premier temps j'aurais voulu voir s'il n'y avait pas quelque chose de plus simple que j'aurais bêtement mal fait par méconnaissance ou mal codé afin d'éviter d'y passer beaucoup de temps !


    • Je n'ai entendu que très récemment parlé du TSkaAnimatedImage mais je pense qu'il est plus réservé aux images du peu que j'ai vu mais peut-être que je me trompe.


    • En ce qui concerne les "LottieFiles" je ne connaissais pas c'est toi qui me l'apprend. Merci du coup


    • Effectivement l'animation ressemble effectivement à celle que tu mentionnes dans le .mp4



    @ALWEBER :

    • Je te remercie pour ta proposition et je suis preneur par ton programme de démo. Tu pourrais peut-être me partager un lien WeTransfer ou autre ?


    • Tu sembles toi aussi penser que les timers posent problème mais je suis surpris par le TTask puisqu'il sert justement à paralléliser le code ? Tu as une idée précise sur ce point à me partager ?


    • Il me semble avoir lu dans une des nombreuses pages que j'ai regardé sur internet qu'il serait préférable que le TFloatAnimation soit utilisé sur le thread principal de l'application. Donc si je lis entre les lignes, moi qui n'ait pas une application threadé, j'en déduis qu'il faudrait qu'il soit sur le TForm Principal de mon application ce qui ne m'arrange pas ! Il n'y a peut-être pas que les timers du coup, il n'est peut-être pas trop adapté pour fonctionner sur des TFrame ? En tous les cas il n'y a pas de contre indication précise sur ce point dans la documentation.



    Si je résume un peu :

    • Vous ne voyez pas forcément une mauvaise utilisation de ma part
    • Vous pensez plutôt le fait que ce type d'animation n'est pas fait pour fonctionner avec des timers et / ou dans des TFrames
    • Je devrais peut-être threader mon application
    • Ou ne plus utiliser de TFloatAnimation et m' orienter vers des solutions de type GIF ou LottiesFiles



    C'est vrai que j'aurais préféré trouver une solution à court terme quitte à retravailler le design et la gestion des threads à moyen terme. Je vais attendre vos retours et si dans l'intervalle d'autres personnes ont des avis ou commentaires ils sont les bienvenus

    Encore une fois merci à tous.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Citation Envoyé par DelphiCode Voir le message
    Je n'ai entendu que très récemment parlé du TSkaAnimatedImage mais je pense qu'il est plus réservé aux images
    Ben, comme son nom l'indique des images animées, peut-être pensais-tu plus Image 3D ? Mais si tu parles de Skia, moi, je l'utilise surtout en remplacement des glyphes, avec les SkSVGs plus besoin de se prendre le chou pour le DPI (le loup ? la nécessité d'ajouter la bibliothèque à l'exe pour le déploiement). Comme Skia est désormais de plus en plus intégré dans Delphi (version 12)

    Citation Envoyé par DelphiCode Voir le message
    Je n'avais pas entendu parler des composants d'Andrea Magni mais la piste semble prometteuse. Cependant cela nécessiterait de revoir une bonne partie du design de mon application !
    AMHA, pas vraiment, selon ta description :
    Dessus j'ai un TLayout et à l'intérieur, je détruis et crée successivement des objets TFrame qui représentent différents écrans.
    Or c'est exactement ça le "départ" de TFrameStand.

    créer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IFrameN:=FrameStand1.New<TFrame2>(MainLayout);
    IFrameN.Show;
    Cacher
    Supprimer
    ou, cacher et supprimer
    Une liste des frames est bien sûr maintenue quelque part

    En bref, c'est le même principe que ce que j'ai pu écrire dans ce tuto sur le docking de forme et FMX mais avec des gros plus et peut-être quelques moins si l'on considère le DragDrop mais là, je n'ai pas encore poussé mon investigation.

    Pprem, m'avait indiqué cette piste, il y a peu, pour résoudre un problème : en gros comment faire pour gérer des actions d'une forme au sein d'une autre forme. L'objectif étant un système de message synchrone (même dans une application android)
    voici un résultat, la fiche complète n'est pas bloquée, car, délibérément pour mes tests, le layout receveur ne recouvre pas tout. En fait, je teste dans ce petit truc :
    L'utilisation de style pour des frames (affichages différents pour un même objectif et, accessoirement (rien à voir) TLang.

    Nom : Capture.PNG
Affichages : 156
Taille : 52,3 Ko

    en PJ le zip en cours

    Objectif final, une unité complète genre helper en ferait une utilisation "simple" (j'ajoute l'unité, le framestand se crée et les actions sont crées) possible, pas possible ? "that is the question"
    Fichiers attachés Fichiers attachés
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par DelphiCode Voir le message
    .../...
    • Je te remercie pour ta proposition et je suis preneur par ton programme de démo. Tu pourrais peut-être me partager un lien WeTransfer ou autre ?

    .../...
    ci joint la démo comme prévu avec un peu de retard car je travaille actuellement sur un projet robotique Je reponds aux autres questions ce WE
    Fichiers attachés Fichiers attachés

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Bonsoir le forum,

    Désolé pour le délai mais j'ai du gérer un imprévu ces derniers jours.
    Merci infiniment à tous les 2 pour vos précieux conseils et vos sources.

    Je vais regarder avec soin les sources et voir si cela peut solutionner mon problème.

    Encore merci pour vos contributions.
    Bonne soirée,

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Bonjour le forum,

    Je suis parti sur la piste du TFrameStand qui à l'air prometteur mais je rencontre un problème d'animation (elles ne se mettent pas à fonctionner !). Cela m'était arrivé et j'avais trouvé comme parade de mettre comme "owner" la main form du projet lors de la création de la frame.

    Avec le TFrameStand, les animations (TFloatAnimation) ne démarrent pas. J'ai essayé de les nommer en OnShow mais ça ne change rien.
    Je joins un projet réduit pour l'exemple, cela sera plus parlant.

    FrameStandCadre.zip

    Si quelqu'un pouvait y jeter un œil ce serait sympa. Je précise que j'ai regardé tous les porjets de démo de TFrameStand et que je m'en suis inspiré mais que je n'y arrive pas quand même. Le fait que je décale la mise à True de la propriété Enabled des TFloatAnimation y est peut-être pour quelquechose ? C'est vrai que dans les projets démo les animations se lancent directement sur le OnShow de la Frame.

    Merci par avance pour votre aide.

  10. #10
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    IL faut passer les objets animation enabled à true dans ton exemple

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Bonjour à tous,

    Merci ALWEBER pour ton aide.
    Sauf erreur de ma part, c'est déjà fait au fond de la procédure "InitArcAnimation".

    Bonne journée

Discussions similaires

  1. Dessiner sur une TFrame
    Par kimlee dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/11/2009, 04h01
  2. Gros lag sur les entrées clavier
    Par cs_ntd dans le forum Windows XP
    Réponses: 12
    Dernier message: 27/08/2008, 11h31
  3. problme mot de passe sur feuille
    Par faby75 dans le forum Excel
    Réponses: 1
    Dernier message: 29/03/2007, 11h17
  4. Scrolling sur un TFrame
    Par Thierry65 dans le forum Delphi
    Réponses: 3
    Dernier message: 02/06/2006, 23h09

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