Laden...

Performance-Problem bei aus Quadraten gezeichnetem Raster

Erstellt von Urganot vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.148 Views
U
Urganot Themenstarter:in
2 Beiträge seit 2014
vor 10 Jahren
Performance-Problem bei aus Quadraten gezeichnetem Raster

Hi,

Ich brauche für mein Projekt ein 50x50 Raster. Momentan löse ich dies, indem ich 2500 kleine Quadrate zeichnen lasse. Das funktioniert auch einigermaßen.

Das Problem ist, wenn ich die Fenstergröße ändere. Dann soll sich die Größe der Quadrate ändern. Das berechnen ist kein Problem.

Zusätzlich bekomme ich Probleme mit der Performance, wenn sich viel schnell ändert.

Kann mir jemand ne Idee geben, wie ich das Raster anders Umsetzen kann? Das wichtige: Wenn ich auf ein Feld des Rasters klicke, muss ich erkennen können, in welches Feld geklickt wurde.

Wenn das die einzige möglichkeit ist, wie kann ich die alten grafiken löschen?

Main Code:


     int kachelgroesse = 10, kachel_zahl = 50;
            Graphics graph = this.CreateGraphics();
            label1.Text = ClientRectangle.Width.ToString();

            for (int u = 0; u < kachel_zahl; u++)
            {
                for (int i = 0; i < kachel_zahl; i++)
                {
                    graph.DrawRectangle(new Pen(Brushes.Black, 1), 200 + i * kachelgroesse, menuStrip1.Bottom + u*kachelgroesse, kachelgroesse, kachelgroesse);
                }
            }
C
2.121 Beiträge seit 2010
vor 10 Jahren

Nicht jedes mal einen neuen Pen erzeugen sondern den gleichen verwenden. Stichwort using.

Statt 2500 Quadraten reicht es wenn du 50 senkrechte und 50 waagrechte Linien zeichnest.

Wenn ich auf ein Feld des Rasters klicke, muss ich erkennen können, in welches Feld geklickt wurde.

Das kannst du doch an der Klickposition ausrechnen.

Wenn das ...

was?

wie kann ich die alten grafiken löschen?

welche?

Nächstes mal bitte noch überlegen ob jemand der dein Projekt nicht kennt (also alle) deinen Text wirklich verstehen kann.

Wann zeichnest du das immer? Dir würde vielleicht ein Bild helfen in das du einmalig alles einzeichnest, statt in jedem OnPaint.

5.657 Beiträge seit 2006
vor 10 Jahren

Hi Urganot,

wenn du ein Raster erstellst, solltest du Linien anstatt Quadrate zeichnen. So reduzierst du die Anzahl der aufgerufenen Zeichenfunktionen und verhindest, daß die Rasterlinien doppelt gezeichnet werden.

Als Beispiel mal angenommen, deine 2500 Quadrate sind in 50 Reihen und 50 Spalten angeordnet, dann ergeben sich 51 x 51 Rasterlinien. Wenn du die Linien anstatt der Quadrate zeichnest, benötigst du also nur 102 Zeichenoperationen anstatt wie bisher 2500.

Allerdings solltest du nicht CreateGraphics verwenden, sondern so vorgehen wie es in [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) beschrieben wird.

In welches Feld geklickt wurde, solltest du relativ einfach über das Koordinatensystem des Rasters berechnen können.

Christian

Weeks of programming can save you hours of planning

U
Urganot Themenstarter:in
2 Beiträge seit 2014
vor 10 Jahren

OK, danke Ich versuchs mal mit Linien

1.361 Beiträge seit 2007
vor 10 Jahren

Hey Urganot,

eine sehr performante Variante sollte sein:

  1. kleines Bild vorbereiten, das nur ein einziges "Kästchen" zeigt. (wobei aber nur links+oben der Gitterrahmen oder unten+rechts zu sehen sein sollte, da er sonst doppelt so breit wird)
  2. Das als Hintergrundbild zuweisen
  3. yourControl.BackgroundImageLayout = ImageLayout.Tile; setzen

beste Grüße
zommi