Partage
  • Partager sur Facebook
  • Partager sur Twitter

Optimisation de code ou de INotifyChanged

Une interface très lente

    13 avril 2023 à 9:07:18

    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:

    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é:

    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)

    <ItemsControl ItemsSource="{Binding Positions}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Canvas>
                    <ContentControl Content="{Binding Converter={view:ElementToViewConverter}}"/>
                </Canvas>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

    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.

    EDIT: Je pense qu'il peut être important de savoir que mon application est en 32bits. Il est planifié de passer en 64bits mais c'est un gros projet. Pensez-vous que les performances sur le UI peuvent être meilleurs ? 

    -
    Edité par JustinVuffray2 13 avril 2023 à 10:22:24

    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2023 à 10:30:52

      Est-ce que les fenêtres sont 'invalidées" par ces changements liée à la translation ? (J'ai peu d'expérience en WPF)

      Le système ne demande la génération d'une nouvelle image de l'IHM que si le contenu (ou une partie) de la fenêtre a été invalidé.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      Optimisation de code ou de INotifyChanged

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown