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 :

Firemonkey (Delphi XE2) - Canvas vs controls -- soucis majeur?


Sujet :

Composants FMX Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Points : 74
    Points
    74
    Par défaut Firemonkey (Delphi XE2) - Canvas vs controls -- soucis majeur?
    Bonjour,

    Je bute sur un gros soucis et je souhaiterai de tout cœur que ce soit moi qui rate l'évidence, parce qu'autrement, FireMonkey a un défaut de conception majeur, osons le mot!

    Le soucis est qu'il y a conflit entre les opérations que vous effectuez sur les canvas (d'un TImage par exemple) et le rafraichissement régulier qu'effectue Firemonkey sur les contrôles visuels.

    J'ai bien entendu essayé de contourner le problème, mais je bute. Ma théorie est la suivante. FM fonctionne via DirectX en mode fenêtré. DirectX n'est pas threadsafe (de ce que j'en sais, mais quasi certitude). Le rafraichissement des controles visuels de FM se fait donc forcément dans le thread principal. Les opérations sur les canvas aussi du coup, puisque DirectX force à utiliser le thread principal.

    Il n'y a apparemment aucune synchronisation entre le moment où FM déclenche les rafraichissement des contrôles visuels et la fin de la mise à jour des Canvas. Aussi régulièrement on a un conflit, qui est résolu par la mise en attente des Canvas, ce qui provoque visuellement un fort ralentissement visuel de leurs opérations.

    Naïvement je pensais que le EndScene à effectuer sur le Canvas ou bien le BitmapChanged était en quelque sorte la synchronisation avec le reste des contrôles. Alternativement il faudrait que l'on puisse indiquer à FM de rafraichir les anims des contrôles uniquement quand on le dit, sur un go général.

    En tout cas, le résultat est catastrophique. Si vous pensiez faire une application graphique ou un jeu en Firemonkey, vous pouvez oublier. Si je ne me trompe pas (et qu'il n'y a aucun moyen de contourner ce gros soucis), alors FM à un gros gros problème!

    nb: j'ai essayé avec ou sans timer threadé, c'est encore pire...

    Vous voulez la preuve? la voici, petite appli de test qui parle d'elle même


    Version avec EXECUTABLE:
    http://www.mediafire.com/?f9ojw4jx8rj5zuh

    La version sans EXE en PJ de ce message.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Je viens de jeter un oeil rapide à ton code.

    Je ne suis pas (encore) expert FireMonkey, mais je pense que le problème vient de ton Timer.

    Tous les FmxObjects sont susceptibles d'avoir un effet graphique, et FireMonkey gère déjà un réaffichage de l'écran pour cela. Ton code devrait donc faire parti d'un effet appliqué à l'Image, effet qui sera alors automatiquement géré par FireMonkey et non déclenché par un Timer indépendant de ce cycle naturel pour une application FM.

    Il faut donc vraisemblablement coller ton code dans la méthode ApplyStyle d'un dérivé de TAnimation...

    Je viens de tester une approche plus simple encore en plaçant ton code dans un TPaintBox.OnPaint (le Timer change juste Frame)...mais je n'arrive pas à afficher le résultat... il doit manquer l'équivalent de Image1.Bitmap.BitmapChanged après le EndScene...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Pocus Voir le message
    Bonjour,

    Je bute sur un gros soucis et je souhaiterai de tout cœur que ce soit moi qui rate l'évidence, parce qu'autrement, FireMonkey a un défaut de conception majeur, osons le mot!
    Tu oses !
    C'est pas l’hôpital qui se fout de la charité ?
    Tu nous ponds un odieux code avec un TTimer !

    Un Jeu ne fonctionne pas du tout comme cela, en général, c'est une boucle infinie qui tourne le plus vite que possible, cela récupère les actions utilisateurs, provoque le dessin en conséquence des actions et de l'IA dans une image cache, puis cela termine, tu envoie l'image cache à DirectX qui permute avec la surface en cours (asynchrone), et tu continues la boucle indéfiniment !

    Ce qui est plus propre c'est même en Win32, c'est plutôt d'avoir un Timer qui lance un Invalidate du Control si une action nécessite son dessin, et dans le OnPaint (ou WndProc\WM_PAINT\WM_WM_ERASEBKGND), tu effectues le dessin au moment opportun, cela réduit les risques de clignotement et souvent donne un code plus performant !

    Même si je pense que vouloir faire une véritable application avec FMX n'est pas crédible pour le moment, il manque trop d'élements (DLL\SO\BPL ?, ShellExecute\Fork), l'IDE ne se prête pas à l'ajout d'élément 2D dans une surface 3D (en tout pas cas via Drag&Drop, cela fonctionne mieux avec IDE Insight)
    Il est bon de découvrir l'outil et d'aider à l'améliorer !
    Faudra voir si FMX pour en utilisation Cross Platform se montre plus pratique qu'une Site Web !
    Pour le moment, pour le Cross Platform et l'utilisation sur terminal portable, mon responsable se dirige plus vers RADPHP + DataSnap, la démo du Code Way Tour donnait l'impression plus d'un gros jouet et surtout qu'il est dommage d'avoir autant de technologie concurrente chez Embarcadero et leurs partenaires, que choisir entre FMX, RADPHP optimisé pour iPhone, IntraWeb\TMS optimisé pour iPhone

    Peut-être qu'avec FireMonkey, il faut justement avoir un code plus architecturé !
    Etudier leurs classes, après tout la documentation, je pense que c'est à nous de l'écrire pour le moment (d'ailleurs, où sont les projets fourni lors des beta-test, dommage qu'Embarcadero ne les propose pas maintenant)

    Je serais toi, je chercherais plutôt sur l'héritage des Animations surtout que la Rotation de texture c'est un élément standard de FMX !
    Je n'ai pas testé ton projet mais tu es sur que tu ne peux pas obtenir la même chose en standard parmis les innombrables effets, voir l'assistant Components Editor : Effets FireMonkeys par Paul Toth

    Ainsi tu créés effectivement un nouvel objet Animation que tu pourras réutiliser par la suite qui sera du coup mieux gérer par FMX !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Points : 74
    Points
    74
    Par défaut
    J'ai pris un bête timer parce que j'obtenais un résultat encore pire en gérant le cadencage via un thread séparé...

    Je pense que Paul Toth a raison sur le fond, c'est ce que je subodore... Il faut pouvoir s'insérer dans les rafraichissements de FMX ... sauf que du coup tu ne gères plus ton frame rate... J'aurai préféré l'inverse, dire à FMX de faire ses effets d'anims quand je lui dis.

    Un des soucis bien sûr est qu'il n' a aucune doc. C'est un peu bête et coupera je pense pas mal l'élan des gens... si FMX est censé être un fer de lance du nouveau Delphi, j'ai peur que ca retombe à plat par manques de doc et exemples sérieux (elle est où l'appli phare de démo, celle avec le squelette humain etc. que l'on nous montre dans les splash screens?)

    Concernant la question 'puis je faire différement via des animations', je vais creuser ... au jugé... mais là je parle de pouvoir afficher des images composées complexes (de dizaines de PNG) sur un canevas... claquer une image qui s'anime ne permet pas de faire une appli graphique ou un jeu.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 735
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    d'ailleurs, où sont les projets fourni lors des beta-test, dommage qu'Embarcadero ne les propose pas maintenant
    ici je crois http://sourceforge.net/projects/radstudiodemos/

Discussions similaires

  1. Firemonkey (Delphi XE2) Application.ExeName
    Par Pocus dans le forum Composants FMX
    Réponses: 4
    Dernier message: 26/04/2019, 16h30
  2. Delphi XE2 FireMonkey : impression ?
    Par Invité dans le forum Débuter
    Réponses: 6
    Dernier message: 12/04/2012, 12h19
  3. Firemonkey (Delphi XE2) exemple basique ne tournant pas
    Par Pocus dans le forum Composants FMX
    Réponses: 7
    Dernier message: 13/09/2011, 09h48
  4. Première présentation de Delphi XE2
    Par John Colibri dans le forum EDI
    Réponses: 53
    Dernier message: 04/09/2011, 11h28
  5. Réponses: 3
    Dernier message: 03/05/2006, 15h30

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