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

Windows Presentation Foundation Discussion :

Problème de performance sur application WPF 4 (rendertransform ? cast ?)


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 64
    Points : 66
    Points
    66
    Par défaut Problème de performance sur application WPF 4 (rendertransform ? cast ?)
    Bonjour à tous,
    Je suis en train de travailler sur une application WPF 4 utilisant le multi-touch. En gros l'application est constituée d'usercontrols que l'on peut déplacer et qui se rajoute au fur et à mesure.

    Le souci que j'ai est au niveau des performances de l'application : ca rame beaucoup trop (c'est le cpu qui prend un claque).

    je me suis donc mis à la recherche de conseil pour optimiser un peu tout ca et je suis tombé sur le site de msdn ou il est dit :
    Update Rather than Replace a RenderTransform
    (http://msdn.microsoft.com/en-us/library/bb613542.aspx).
    J'utilise beaucoup le rendertransform, malheureusement il ne donne pas d'exemple et je ne sais pas comment "updater" un rendertransform.
    Je fais comme ceci pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //je prends la matrix actuel de l'object
     Matrix rectsMatrix = ((MatrixTransform)birdy.RenderTransform).Matrix;
    //je calcul la nouvelle
    rectsMatrix = ManipulationsHelper.TranslateElement(birdy, e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y, rectsMatrix);
    // je l'assigne
    birdy.RenderTransform = new MatrixTransform(rectsMatrix);
    J'ai aussi d'autres pistes pour les problèmes de performance :

    1/ Certain usercontrols ont été importés à partir d'illustrator et sont affreusement gros (plein de path). Est ce que cela peut avoir un impact très négatif sur les performances ?

    2/ Il y a beaucoup de cast dans le code, j'utilise pas mal la métohde "T FindAncestor<T>(this UIElement obj)" qui permet de retrouver les éléments parent. Y a-t-il un moyen d'optimiser les cast lorsqu'ils sont nombreux ?

    3/ Avez-vous des conseils en général pour éviter une trop grande consomation en cpu sur les applis WPF ? J'ai également commencé a créer un petit shoot'em up en silverlight et je suis confronté au même problème : je me sers du render transform et je ne peux pas afficher trop d'objet sinon le cpu craque ?!?

    Les questions sont peut-être un peu générales et évasives, mais c'est vrai que je ne m'étais pas réellement intéressée à ce sujet vu que la plupart de mes projets restait jusqu'à présent assez simple.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par tom741 Voir le message
    birdy.RenderTransform = new MatrixTransform(rectsMatrix);
    La, tu réaffectes un nouvel objet au lieu de remplacer l'ancien.

    Essaye un truc dans le genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //je prends la matrix actuel de l'object
     Matrix rectsMatrix = ((MatrixTransform)birdy.RenderTransform).Matrix;
    //je calcul la nouvelle
    rectsMatrix = ManipulationsHelper.TranslateElement(birdy, e.DeltaManipulation.Translation.X, e.DeltaManipulation.Translation.Y, rectsMatrix);
    // je l'assigne
    ((MatrixTransform)birdy.RenderTransform).Matrix.M11 = rectsMatrix.M11;
    ((MatrixTransform)birdy.RenderTransform).Matrix.M12 = rectsMatrix.M12;
    Etc...


    1/ Certain usercontrols ont été importés à partir d'illustrator et sont affreusement gros (plein de path). Est ce que cela peut avoir un impact très négatif sur les performances ?
    Très négatif, c'est vite dit mais effectivement, si tu animes/transformes ces paths, c'est pas tip-top.

    2/ Il y a beaucoup de cast dans le code, j'utilise pas mal la métohde "T FindAncestor<T>(this UIElement obj)" qui permet de retrouver les éléments parent. Y a-t-il un moyen d'optimiser les cast lorsqu'ils sont nombreux ?
    Pas que je saches, à part éviter les cast

    3/ Avez-vous des conseils en général pour éviter une trop grande consomation en cpu sur les applis WPF ? J'ai également commencé a créer un petit shoot'em up en silverlight et je suis confronté au même problème : je me sers du render transform et je ne peux pas afficher trop d'objet sinon le cpu craque ?!?
    Normalement, en WPF, c'est la carte graphique qui bosse en priorité: tu as vérifié ce point ? En SL, il faut activer le CacheMode et mettre le param EnableGPUAcceleration à true.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 64
    Points : 66
    Points
    66
    Par défaut
    bonjour,

    quand je mets le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((MatrixTransform)element.RenderTransform).Matrix.M11 = matrix.M11;
    j'ai une jolie erreur :

    Cannot modify the return value of 'System.Windows.Media.MatrixTransform.Matrix' because it is not a variable.
    J'ai bien regardé pour le cpu, j'ai essayé le performance wizard. Pour la carte 3D je ne sais pas trop : j'ai une quadroFx 550 sur mon poste. A certains moment, le cpu sature un peu sans raison apparente (une simple animation est lancée). Bref, ca freeze de temps en temps, pas forcément lorsque j'exécute la même action.

    Je vais quand même looker mon code pour essayer de nettoyer

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 64
    Points : 66
    Points
    66
    Par défaut
    Je déterre un peu le sujet pour vous faire partager ce que j'ai fait.

    1/ Le bitmapCache pour les graphiques est plutôt efficace. Sans toucher aux réglages, les graphiques sont légèrement "floutés" et dans le cas présent le rendu est plus sympa avec.

    2/ La solution que j'ai trouvée pour ne pas réaffecter à chaque fois un nouveau matrixTransform, c'est d'utiliser à la place un TransformGroup qui permet de changer directement les valeurs sur le TranslateTransform.

    3/ Il y avait une belle fuite mémoire : l'application crée sans cesse des UserControl dans une grid, pour éviter qu'il y est trop d'UserControl, je vidais la grid régulièrement (maGrid.Children.Clear()). Cependant, le garbage collector ne prenait pas en compte les UserControls qui étaient "effacés".

    J'ai essayé le logiciel ANTS Memory profiler, il m'a permis de voir que certains éléments (références à d'autres objets, des dispatcherTimer) garder "en vie" les userControls.

    Résultat après deux heures de run :

    - avant modification : 350mo consommé par l'application

    - après modification : 60mo...

    Pas besoin de commentaires

    Merci pour les pistes Thomas.

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

Discussions similaires

  1. Divers problèmes de performance sur une application Swing
    Par Julien Bodin dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 06/09/2010, 15h28
  2. Problèmes de performances sur une base oracle 10g
    Par ORAMEL dans le forum Oracle
    Réponses: 3
    Dernier message: 11/09/2007, 09h11
  3. Problème de charge sur application web
    Par sparrow.rd dans le forum Apache
    Réponses: 3
    Dernier message: 17/08/2007, 14h12
  4. Réponses: 3
    Dernier message: 20/04/2007, 12h19
  5. Problème de performance sur une "grosse" BD
    Par frechy dans le forum Installation
    Réponses: 9
    Dernier message: 19/09/2005, 16h52

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