2010-11-02 17 views
2

J'ai un PictureBox qui sert de toile. A List<RectangleObj> la taille du tableau de aprox 8000.C# Slow Paint Event: peindre un grand nombre d'objets

Le "RectangleObj" est une simple classe rectangle, une fois que vous invoquez sa méthode Draw(Graphic g) il attirera

  1. la frontière en utilisant g.DrawRectangle(...) et,
  2. remplissage le rectangle avec une transparence alpha utilisant g.FillRectangle(...)

Dans l'application Form.cs, j'utilise le pictureBox1_Paint(...) pour boucler le tableau de RectangleObj et invoquer la méthode Draw de cette classe.

Comme ceci.

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    for (int i = 0; i < RectList.Count(); i++) //List<RectangleObj> count = 8000 
      RectList[i].Draw(e.Graphics); 
} 

Chaque fois que les clics de souris sur un RectangleObj et fait glisser changer son emplacement (événement de déplacement de la souris) l'événement de peinture est appelée. Comme le tableau est grand, l'événement paint n'a pas assez de temps pour terminer sa boucle et est inondé de mouvements de souris. cela rend l'événement Paint lent.

Quelqu'un peut-il me conseiller comment optimiser cette procédure.

Répondre

1

Il y a deux choses ici:

  1. ne pas tirer tout en se déplaçant. Calculer un contour pour les éléments sélectionnés et XOR seulement ce contour lorsque la souris se déplace. Repaint sur MouseUp.
  2. ne pas dessiner des choses dont vous n'avez pas besoin. Vous pouvez exécuter un algorithme pour détecter les rectangles totalement masqués et les ignorer.
  3. Assurez-vous d'avoir DoubleBuffered = true pour votre PictureBox
+0

Merci .. je suis très sûr que cela ferait .. –

+0

Pas besoin de s'inquiéter du point n ° 3, le contrôle PictureBox est déjà DoubleBuffered. – LarsTech

0

Déterminez quels rectangles doivent être redessinés en fonction de l'emplacement du rectangle mobile et de son emplacement antérieur et ne faites que les redessiner. Découpez la peinture uniquement sur les parties qui ont été invalidées.

+0

Oui merci. Votre réponse m'aide. mais j'ai un autre scénario qui est. Si la souris sélectionner et déplacer est plus de 3000 rectangles. Considérez cela comme un exemple. une image représentant une page d'un livre. chaque caractère représentant comme un rectangle. Si l'utilisateur appuie sur CTRL + A, il sélectionne tout rectangle et lorsque l'utilisateur déplace la souris, il déplace tous les rectangles. Dans le scénario ci-dessus, une très grande quantité de rectangles doit être peinte. Ceci est la dernière préoccupation en attente. –

+0

Hmmm, peut-être que ça vaudrait la peine de mettre en cache ce qui a été peint dans une image bitmap et de repeindre tout le bitmap. – Kell

3

Avez-vous envisagé de dessiner dans un bitmap en mémoire, puis de l'appliquer à l'écran?

+0

Non. n'a pas essayé ça. Je vais essayer mais je ne pense pas que cela suffirait à réduire le temps de dessin. –