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 Forms Discussion :

Eviter les nombreux appels à OnPaint dûs au nombre de contrôles présents sur le form


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Par défaut Eviter les nombreux appels à OnPaint dûs au nombre de contrôles présents sur le form
    Bonjour,

    Je suis actuellment occupé à améliorer les performances visuelles d'une application winform.

    J'ai remarqué que les méthodes OnPaint et OnPaintBackground d'une Form ou d'un UserControl étaient appelées à chaque fois qu'un contrôles de cette form ou de ce user control était dessiné.

    Faites le test : nouveau projet avec une seule winform, overridez OnPaint dans le classe Form1 et dedans Console.WriteLine("OnPaint");

    protected override void OnPaint(PaintEventArgs e)
    {
    Console.WriteLine("OnPaint");
    base.OnPaint(e);
    }

    On lance l'applic.
    la sortie nous donne une seule ligne.

    Rajoutons maintenant 2 boutons sur la form.
    On lance l'applic.
    la sortie nous donne 3 lignes (donc 3 passages dans OnPaint).

    Ceci est également valable pour OnPaintBackground.

    Je comprends bien qu'il soit nécessaire que ces méthodes soient appelées après que les boutons soient dessinés un à un, cependant, cela peut devenir fort coûteux en performance.

    Exemple : lorsqu'un user control passe de visible=false à visible=true, le background du user control va se peindre autant de fois que le user control contient de contrôles et il y a dès lors, je pense, un risque de scintillement.

    Quelqun connait-il, dans cet exemple, par exemple, un moyen d'éviter ces multis paint et de ne peindre le tout une bonne fois pour toute, une fois tous les contrôles dessinés ??

    Ou bien fais-je fausse piste ?

    Merci d'avance pour vos impressions ainsi que votre savoir

  2. #2
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Je pense sincèrement que tu dois laisser ce genre de considération au framework. Les mecs qui l'ont mis au point ont probablement pensé à cela et je pense que l'affichage des controles est déjà optimisé.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ce n'est pas parce que tu passes dans la méthode OnPaint que tout est redessiné... en fait seule la partie invalidée est réellement redessinée (la propriété ClipRectangle du PaintEventArgs)
    Enfin, je ne suis pas tout à fait sûr de comment ça marche, mais quand je fait un Paint personnalisé, si j'invalide toute la zone à dessiner, il y a un "clignotement" de l'image parce que tout est rafraichi, alors que si seule une petite partie est invalidée, je n'ai pas ce clignotement : seule la zone invalidée est rafraichie. Pourtant je ne me préoccupe pas dans le code de savoir quelle est la zone invalidée, je suppose que c'est géré par le Framework ou par GDI+

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    pour répondre à certains, la gestion du graphisme du framework est une vrai merde
    une centaine de label qui clignotent : vb6 : 1% d'utilisation du pross
    vb.NET2 : 50%

    gdi+ n'utilise pas d'accélération matérielle


    une des méthodes pour gagner un peu de temps et de réécrire une partie des controles ...
    en réérivante le label on arrive à 2 ou 3 %
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ce n'est pas parce que tu passes dans la méthode OnPaint que tout est redessiné... en fait seule la partie invalidée est réellement redessinée (la propriété ClipRectangle du PaintEventArgs)
    Enfin, je ne suis pas tout à fait sûr de comment ça marche, mais quand je fait un Paint personnalisé, si j'invalide toute la zone à dessiner, il y a un "clignotement" de l'image parce que tout est rafraichi, alors que si seule une petite partie est invalidée, je n'ai pas ce clignotement : seule la zone invalidée est rafraichie. Pourtant je ne me préoccupe pas dans le code de savoir quelle est la zone invalidée, je suppose que c'est géré par le Framework ou par GDI+
    En effet, hélas, dans les tests que j'ai fait, dans le cas précis, le ClipRectangle couvre l'entièreté de la form à chaque paint. Hélas.




    Sperot51, ce que tu dis ne m'étonne pas vraiment.

    Vois-tu le moyen d'empêcher le paint de la form ou du usercontrol tant que le dernier contrôle n'a pas été redessiné, par exemple lorsque usercontrol.Visible est passé à true.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    j'espere que ces problèmes de perf sont résolus avec WPF, qui ne s'appuie pas sur les API Win32 et est supposé utiliser l'accélération matérielle...

Discussions similaires

  1. [AC-2010] Calculer le nombre de personnes présentes sur des tranches horaires
    Par kader daret dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 21/02/2014, 18h26
  2. Réponses: 2
    Dernier message: 02/10/2013, 21h57
  3. Formater une cellule nombre pour eviter les dieses
    Par z89bo198 dans le forum Excel
    Réponses: 1
    Dernier message: 12/07/2009, 18h06
  4. [TP] Lecture de nombres : comment éviter les plantages ?
    Par le-an dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 20/11/2005, 14h54
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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