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

C# Discussion :

Optimisation de code ou de INotifyChanged


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2022
    Messages : 12
    Points : 16
    Points
    16
    Par défaut Optimisation de code ou de INotifyChanged
    Hello,
    J'ai un problème avec mon programme (C# / WPF). Je n'ai pas trouvé une réponse dans les postes déjà existant. Peut-être que j'ai mal exprimer mon problème.

    Un petit brief sur mon application. J'ai une image qui est affichée, sur cette dernière on met des pin. Bien sur l'image n'est pas affichée en entière dans l'application. Il est donc possible de la bouger, zoom in et zoom out. (L'image est une image live, un flux)

    Du coup je vous explique mon problème; j'ai une liste d'objet Position qui peut contenir jusqu'à 2500 Positions. L'objet Position contient sa PositionOnWindow. Je peux appliquer un déplacement sur ses 2500 Positions en d'autres mots je fais une translation. Jusque là c'est assez simple, le problème et que lorsque j'applique une translation le code s’exécute en 90ms en moyenne mais le UI met 5-10 sec à se rafraîchir ce qui me fait dire que c'est un problème de INotifyChanged qui est levé 2500 fois.

    Voilà ma boucle qui prend en compte le déplacement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (var pos in Positions)
    {
        Application.Current.Dispatcher.BeginInvoke((Action)(() => { pos.PositionOnWindow += pixelDisplacement; }));
    } //94ms ellapsed
    J'ai testé avec et sans le Dispatcher. Sans le Dispatcher on voit bien les positions se mettre à jour les une après les autres, le temps pour avoir toutes les positions mise à jour est donc encore plus lent.

    Voici ma propriété:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public Point PositionOnWindow
    {
        get => _positionOnWindow;
        set
        {
           if(_positionOnWindow == value) return;
           lock (_lockPositionOnWindow)
           {
               _positionOnWindow = value;
               DoPropertyChanged();
           }
        }
    }
    private Point _positionOnWindow;
    Voici la manière que j'utilise pour display mes positions: (le ContentControl va utiliser une propriété qui est le type de "view" lié a un objet)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <ItemsControl ItemsSource="{Binding Positions}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Canvas>
                    <ContentControl Content="{Binding Converter={view:ElementToViewConverter}}"/>
                </Canvas>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    Quelques informations en plus:
    1. Mon application est en 32bits, je ne pense pas que cela fasse un grand changement.
    2. J'ai vu que le première éléments dans la liste Positions est render en 2.06ms, le dernier lui met 52ms (chaque position est plus lente que la précédente). Je n'arrive pas à comprendre pourquoi.
    3. J'ai trouvé un article parlant du fait que INotifyChanged était obsolète mais il n'y avait pas de solution pour le remplacer. Je viens donc d'éjà vous demander ce que vous pensez de ce problème ? Est-ce que il y a une autre manière pour faire cette opération sans que le UI soit lent ?

    Je répond très volontiers a vos questions. J'espère que j'ai bien expliquer mon problème.
    Merci d'avance.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    essaye à tout hasard avec ca


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using(var d = Dispatcher.DisableProcessing())
    {
        /* your work... Use dispacher.begininvoke... */
    }
    sinon il faudra surement coder un container pour gérer tout toi même

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2022
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Hello, cela ne fix pas mon problème.
    C'est pas grave. Je vais faire en sorte que une seule position soit calculée et que les autres seront calculé par rapport a cette position pour limiter le nombre de binding.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2022
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2022
    Messages : 13
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Je ne fais pas de WPF, mais je pense que le temps de calcul n'est pas un problème, cela vient certainement de l'affichage ... surtout l'affichage de 2500 objets.

    Regardez à tout hasard le design pattern Fly weight (Poids mouche).

    Cdt.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    et ca ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Application.Current.Dispatcher.BeginInvoke((Action)(() => 
    {
     
      foreach (var pos in Positions)
      {
         pos.PositionOnWindow += pixelDisplacement; 
      } 
     
    }));

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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