6
votes

Propre Winforms Controls Flickers et a une mauvaise performance

J'ai deux problèmes avec un propre contrôle utilisateur qui utilise des bitmaps:

  1. Il scintille si c'est redessiné via la méthode de «rafraîchissement» de .NET. LI>
  2. Il a une mauvaise performance. LI> ol>

    Le contrôle est composé de trois bitmaps: p>

    • une image d'arrière-plan statique. LI>
    • un rotor rotatif. li>
    • Une autre image en fonction de l'angle du rotor. LI> ul>

      Tous les bitmaps d'occasion ont une résolution de 500 x 500 pixels. Le contrôle fonctionne comme ceci: https://www.dropbox.com/s/t92guestwdkx8z/stattatandrotor.gif (c'est une animation GIF ) P>

      Le contrôle de l'utilisateur doit s'attirer chaque fois qu'il reçoit un nouvel angle de rotor. Par conséquent, il a une propriété publique 'rotorangle' qui ressemble à ceci: p> xxx pré>

      rafraîchir code> augmente l'événement code> code>. Le gestionnaire d'événements p> p> xxx pré>

      mais lorsque j'utilise ce code - ce qui fonctionne bien dans d'autres contrôles d'utilisateur - le contrôle de l'utilisateur est Non dessiné du tout si le contrôle est double tampon via setStyle (contrôlstyles.optimizeddoublebuffer, true) code>. Si je ne configurais pas ce drapeau sur true, le contrôle des flickers lors de la redécoupage. P>

      dans le constructeur de contrôle I SET: P>

      public float RotorAngle
      {
          get { return mRotorAngle; }
          set
          {
              mRotorAngle = value;
              Draw(mRotorAngle);
          }
      }
      


2 commentaires

Je ne peux pas entrer dans tous les détails maintenant, mais vous devez regarder la double tampon. Heureusement, il est très simple en 2008+ la façon dont vous faites l'actualisation dans la propriété est également mauvaise.


Veuillez ne pas double tampon si votre application peut être utilisée sur desktop à distance - voir Ce lien . Vous pouvez vérifier si la session en cours est à Remote Desktop avec: si (Systeminformation.terminalserverSession) ...


5 Réponses :


2
votes

Dessin à l'écran sur l'événement de peinture est une forte opération. Faire de la peinture sur mémoire tampon est relativement très rapide.

double tampon améliorera les performances. Au lieu de dessiner sur des graphiques de peinture, créez un nouveau graphisme et faites-le tout de le dessiner.

Une fois le dessin bitmap terminé, copiez l'ensemble du bitmap vers E.Graphics reçu de PAINTEventargs

Dessin sans scintillement à l'aide de GDI + et C # < / a>


0 commentaires

4
votes

Premièrement, la réponse de Larstech, vous devez utiliser le contexte graphiques fourni dans le PAINTEventARGS . En appelant Creategraphics () à l'intérieur du gestionnaire de peinture , vous empêchez optimisédoublebuffer de fonctionner correctement.

second, dans votre bloc SetStyle, ajoutez: xxx

... Pour empêcher le contrôle de la classe de base de remplir la couleur d'arrière-plan avant d'appeler votre gestionnaire de peinture.

J'ai testé cela dans votre exemple projet , il semblait éliminer le scintillement.


0 commentaires

4
votes

N'utilisez pas Creategraphics , mais utilisez l'objet graphique qui vous a été transmis à partir de l'événement de peinture:

J'ai changé comme et ajouté clairement depuis que le redimensionnement montrerait l'image fantôme: xxx

appelé à partir de: xxx

dans le constructeur, activez le double tampon, mais je pense que la transparence n'est pas la transparence T nécessaire: xxx


0 commentaires

0
votes

Pour ma réponse, j'ai pris l'inspiration de https://stackoverflow.com/a/2608945/455904 et j'ai nabbé des trucs de Leststechs répondorms ci-dessus.

Pour éviter de régénérer l'image complète sur toutes les ondulations, vous pouvez utiliser une variable pour maintenez l'image générée. p>

public float RotorAngle
{
    get { return mRotorAngle; }
    set
    {
        mRotorAngle = value;
        Invalidate();
    }
}


0 commentaires

0
votes

Merci beaucoup pour votre aide.

scintillement est résolu. :)

maintenant, je suis Suggestion de Larstech's et utilisez le Graphiques Objet à partir de PAINTEventARGS .

Merci lnmx pour l'indice que créationgraphics () intérieur peinture Le gestionnaire empêche la fonction correcte de optimisédoublebuffer . Ceci explique le problème scintillant même si optimisédoublebuffer a été activé. Je ne savais pas que et je n'ai pas non plus trouvé cela à Bibliothèque MSDN . Dans mes commandes précédentes, j'ai également utilisé l'objet graphiques à partir de painteventargs .

merci SALLALE pour vos efforts. Je vais tester votre code aujourd'hui et je vais donner des commentaires. J'espère que cela améliorera les performances car il ya toujours un problème de performance - malgré un double tampon correct.

Il y avait encore un autre problème de performance dans mon code d'origine.

modifié < Pré> xxx

à xxx


0 commentaires