Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
viele und lange texte auf panel: verschieben der "zeichnung" dauert extrem lange
kraeppy
myCSharp.de - Member



Dabei seit:
Beiträge: 50
Herkunft: ruhrpott

Themenstarter:

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

beantworten | zitieren | melden

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 :D
vllt kennt jemand doch noch eins, zwei tricks ^^

angenehmen feierabend wünscht

kraeppy
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Hallo kraeppy,

siehe im Allgemeinen [Artikel] Zeichnen Optimieren / Schnelles zeichnen und [GDI+] Komponente zum einfachen Zeichnen von Elementen (inkl. Scrolling, Zooming + Hittesting)
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kraeppy
myCSharp.de - Member



Dabei seit:
Beiträge: 50
Herkunft: ruhrpott

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.111

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
ThomasE.
myCSharp.de - Member



Dabei seit:
Beiträge: 454

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers