Laden...

viele und lange texte auf panel: verschieben der "zeichnung" dauert extrem lange

Erstellt von kraeppy vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.757 Views
K
kraeppy Themenstarter:in
50 Beiträge seit 2010
vor 10 Jahren
viele und lange texte auf panel: verschieben der "zeichnung" dauert extrem lange

nabend 😃

ich entwickle zZ ein programm, das u.a. viele (ca 1000) und teilweise lange (ich peil jetzt ma ca 60, 70 zeichen an) texte zeichnen muss.
als zeichen-fenster habe ich ne win-form, panel drupp (docking = fill, doublebuffered = jo) und auf dem panel wird munter gezeichnet (natürlich nur im paint-event).

die texte werden alle in einem unterschiedlichen winkel aber an genau bestimmten punkten gezeichnet.
ich habe die funktionalität eingebaut, dass bei gedrücktem mausrad die zeichnung verschoben wird und beim scrollen korrekt rein/rausgezoomt wird.

die gedrehten texte werden mit den funktionen des painteventargs "gemalt".
hier ist der code ausschnitt:

void DrawRotatedText(float Angel, string Text, PointF Position, PaintEventArgs e, Font F)
        {
            if (float.IsNaN(Angel)) return;
            if (Position.X > -100 && Position.X < this.Width + 10)
                if (Position.Y > -100 && Position.Y < this.Height + 10)
                {
                    Graphics g = e.Graphics;
                    SizeF size = g.MeasureString(Text, F);
                    g.TranslateTransform(Position.X, Position.Y - size.Height);
                    g.RotateTransform(360 - Angel);
                    g.DrawString(Text, F, Brushes.Black, new PointF(0, 0));
                    g.ResetTransform();
                }
        }

die methode wird für jeden text aufgerufen.
in den seltenen fällen, in denen die texte kurz sind (<15 zeichen), merkt man keine verzögerung.
aber bei der o.g. länge ist das doch schon bööse ^^

hat jemand von euch ne idee, wie ich den code optimieren könnte?
zur info: die methode wird für jeden text **einzeln **aufgerufen. diese texte werden nicht in einer liste gespeichert. **unterschiedliche **objekte, die in unterschiedlichen listen liegen, können texte in bestimmten richtungen haben und beim durchiterieren dieser objekte wird geschaut, ob informationen zum zeichnen vorhanden sind, wenn ja, wird die o.g. funktion aufgerufen.

eine idee würde mir in den sinn kommen...
ich speicher die texte seperat in einer liste, die ich auch nur fürs zeichnen benutze...
anstatt in der methode die form dann wieder zurück zum ursprung zu drehen, wird der winkel berechnet, der nötig ist, um die form so zu drehen, dass der nächste text gezeichnet werden kann. natürlich müsst ja auch noch die differenz der x und y werte berechnet werden für die nötige translation.... texte sollen ja net übereinander gemalt werden ^^

wäre ein einsatz... aber bevor ich das einbaue, dacht ich mir hol dir mal rat von experten 😄
vllt kennt jemand doch noch eins, zwei tricks ^^

angenehmen feierabend wünscht

kraeppy

5.658 Beiträge seit 2006
vor 10 Jahren

Hi kraeppy,

ein paar Ideen zur Optimierung:

  • Nur das zeichnen, was auch gerade sichtbar ist (Clipping)
  • Transformationsmatrizen für jeden Text zwischenspeichern und nur updaten, wenn gescrollt oder gezoomt wird
  • Jeden Text in ein Bitmap zwischenspeichern und statt dem Text nur das Bitmap zeichnen

Ansonsten solltest du dir mal mit einem Profiler anschauen, welche Texte wie oft gezeichnet werden und was genau dabei wie lange dauert. Ansonsten ist die Frage zu allgemein, um konkretere Tips zu geben.

Christian

Weeks of programming can save you hours of planning

K
kraeppy Themenstarter:in
50 Beiträge seit 2010
vor 10 Jahren

jo jo 😃

sobald ich morgen wieder zugriff drauf habe, werde ich die ideen mal umsetzen. profiler ist ne gute idee...

das clipping hab ich schon implementiert aber an einer anderen stelle. ist mir auch erst gerade eingefallen, als ich es gelesen habe.

danke schonmal im voraus!
schönen abend noch,
lg

kraeppy

C
2.121 Beiträge seit 2010
vor 10 Jahren

Oder alles in ein Bild zeichnen und beim Verschieben nur das Bild verschieben.
Falls das zu deiner Anwendung passt.

Oder statt dem Text beim Verschieben nur eine Linie zeichnen und erst beim losassen die Texte nochmal richtig malen.

Du sprichst von insgesamt um die 50.000 Zeichen. Passen die noch auf einen Bildschirm oder gibts da noch Potential zur Optimierung?

T
461 Beiträge seit 2013
vor 10 Jahren

Einzelnen Elemente in Bitmaps kann ganz schön in die Hose gehn ab einer gewissen Größe/Anzahl..

Bin ich schon mal eingefahren, würde das lieber abraten..

.

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄