Ich entwickle eine beibehaltene Moduszeichnung in GDI +. Die Anwendung kann einfache Formen auf eine Arbeitsfläche zeichnen und grundlegende Bearbeitungen vornehmen. Die Mathematik, die dies tut, ist auf das letzte Byte optimiert und ist kein Problem. Ich zeichne auf einem Panel, das den eingebauten Controlstyles.DoubleBuffer verwendet.Winforms: Wie beschleunige ich Invalidate()?
Jetzt entsteht mein Problem, wenn ich meine App auf einem großen Monitor maximiert (HD in meinem Fall). Wenn ich versuche, eine Linie von einer Ecke der (großen) Leinwand zu der diagonal gegenüberliegenden Seite zu zeichnen, beginnt sie zu verzögern und die CPU geht hoch.
Jedes grafische Objekt in meiner App hat eine Boundingbox. Wenn ich also die Boundingbox einer Zeile ungültig mache, die von einer Ecke der maximierten App zur gegenüberliegenden Diagonale geht, ist diese Boundingbox virtuell so groß wie die Canvas. Wenn ein Benutzer eine Linie zeichnet, erfolgt diese Ungültigkeitserklärung der Boundingbox auf dem Ereignis mousemove, und es ist eine deutliche Verzögerung sichtbar. Diese Verzögerung ist auch vorhanden, wenn die Linie das einzige Objekt auf der Arbeitsfläche ist.
Ich habe versucht, dies in vielerlei Hinsicht zu optimieren. Wenn ich eine kürzere Linie zeichne, sinkt die CPU und der Lag. Wenn ich das Invalidate() entferne und den anderen Code behalte, ist die App schnell. Wenn ich eine Region (die nur die Figur überspannt) anstelle der Boundingbox für ungültig erklären, ist sie genauso langsam. Wenn ich die Boundingbox in eine Reihe kleinerer Boxen aufspalte, die Rücken an Rücken liegen, und somit den Invalidierungsbereich verkleinern, kann keine sichtbare Leistungssteigerung festgestellt werden.
So bin ich ratlos hier. Wie kann ich die Ungültigerklärung beschleunigen?
Nebenbei bemerkt, beide Paint.Net und Mspaint leidet unter den gleichen Shortcommings. Word und PowerPoint scheinen jedoch in der Lage zu sein, eine Zeile wie oben beschrieben ohne Verzögerung und ohne CPU-Last zu zeichnen. So ist es möglich, die gewünschten Ergebnisse zu erzielen, die Frage ist wie?
Word und Powerpoint verwenden nicht GDI + ... Ich glaube nicht, GDI + wurde jemals für seine Geschwindigkeit gelobt (über Plain GDI). –
Haben Sie versucht, mit einem Profiler zu sehen, wo die Verlangsamung tatsächlich auftritt? Ich habe einen Haufen dieser Art von Dingen gemacht (vor Ewigkeiten in Delphi) und habe Invalidate() nie gefunden, um eine wahrnehmbare Menge an Zeit zu nehmen. Das Malen hingegen war "Spaß", schnell genug zu laufen, um eine Linie zu gummieren. – Bevan
Nun, ich glaube Delphi ist auf jeden Fall viel schneller für diese Art von Arbeit. Wie Henk sagt, GDI + ist überhaupt nicht bekannt für Geschwindigkeit, wahrscheinlicher Mangel davon. Der eigentliche Zeichencode ist jedoch nicht der Engpass. Die Ungültigkeit der großen Fläche scheint zu sein. Ich überlege mir, meinen eigenen Backbuffer zu verwenden und das Bild manuell zu blittieren, um zu sehen, ob ich einen Leistungsgewinn erzielen kann. Können Sie einen Profiler speziell für VS2005 empfehlen? – Pedery