Laden...

Schlechte Performance bzw. Verzögerung beim Verschieben eines Fenster mit vielen Panels

Erstellt von sharpType vor 13 Jahren Letzter Beitrag vor 13 Jahren 17.406 Views
S
sharpType Themenstarter:in
228 Beiträge seit 2009
vor 13 Jahren
Schlechte Performance bzw. Verzögerung beim Verschieben eines Fenster mit vielen Panels

Hallo Profis,

ich habe mel eine generelle Frage. Ich arbeite mit Windows-Forms und habe kürzlich erst meine Formen halbwegs flackerfrei bekommen (ich arbeite mitvielen Panels) indem ich doubleBuffered = true setze in meiner MyFlickerFreePanel-Klasse, die von Panel erbt. Gut soweit, es flackert erstmal nichtsmehr, jedoch kommt mir die Performance beim Resize der Form irgendwie seltsam vor:

Ich ziehe und erst 500ms später ca. passt sich die Form und deren INhalt an, zwar ohne zu flackern, aber irgendwie langsam und zäh. Wenn die Option "INhalte beim Ziehen anzeigen" aktiviert ist in Windows, ansonsten tritt das Problem natürlich nicht auf.

Als Beispiel der dotNET-Reflector, ziehe ich da die Form größer von dem Hauptfenster läuft das super flüssig und performant ab, wo ist da der Unterschied? Das Programm ist doch auch in dotNET programmiert und ich denke mal mit FOrms, WPF hätte man doch schon an der Oberfläche erkannt?! 🤔

Diese ganze Geschichte mit SetStyle und OnPaintBackground überschreiben und und und brauch man doch nur (soweit ich das verstanden habe), wenn man z. B. flüssig mit Forms und GDI+ zeichen möchte? Ich möchte ja nur, dass meine Buttons, Listen, Knöpfe etc. , also alles standardmäßige was so auf einer Form drauf ist (u. a. mit FILL), sich beim Resize der Form performant und flüssig anpasst wie zB beim dotNET-Reflector. Ganz schlimm war das noch mti dem Flackern von den Panels, aber das habe ich zum Glück schon beheben können mit doubleBuffer.

Bin für jeden TIpp dankbar. 🙂

Gruß

Gelöschter Account
vor 13 Jahren

Der Reflector hat da nur einige wenige Controls, daher geht das flüssig.

flüssig mit Forms und GDI+ zeichen

Das ist eine Gradwanderung. Die Performance hat sehr sehr eng gesteckte Grenzen.

2.223 Beiträge seit 2005
vor 13 Jahren

Hallo sharpType,

das ist klingt auf jeden Fall erst einmal recht Komisch,

kannst Du uns mehr über deine Fenster sagen,

welche Events benutzt du, wie viele Controls benutzt Du,...

möglicherweise kannst Du uns auch einmal ein Screen Shot deiner Applikation zur Verfügung stellen

Viele Grüße
Lars

F
10.010 Beiträge seit 2004
vor 13 Jahren

(ich arbeite mitvielen Panels)

Das ist meist ein architektonischer Fehlstart.

Warum meinst du das so machen zu müssen, bzw welches Problem soll diese Herangehensweise Lösen?

S
sharpType Themenstarter:in
228 Beiträge seit 2009
vor 13 Jahren

EIn Beispiel ist das folgende:

Ich klicke auf den Button More und (ich habe den Screenshot genau rechtzeitig gemacht) passiert folgendes,wenn sich die Form erweitert.

s. Anhang

S
sharpType Themenstarter:in
228 Beiträge seit 2009
vor 13 Jahren

Kurz darauf sieht sie so aus:

F
10.010 Beiträge seit 2004
vor 13 Jahren

Und was machst du da beim Clicken?

S
sharpType Themenstarter:in
228 Beiträge seit 2009
vor 13 Jahren

Das ist ja das "lustige", eigentlich gar ncihts, nur this.width += 300;

🤔

F
10.010 Beiträge seit 2004
vor 13 Jahren

Es ist eher unlustig es so zu implementieren.

WindowsForms benutzt die Windows API zum zeichnen von Windows also wird in diesem Fall eine Nachricht verschickt, die vom Fenster selber dann verarbeitet wird.
Dabei werden dann haufenweise andere Nachrichten verschickt, die dann nach und nach eintrudeln.
Wobei Window in Win32 jedes UI Element ist, also auch Buttons usw., also alles was Handles hat.

Setze erstmal das MoreOptions Panel/Groupbox Visible auf false, setze die breite und danach dann die Visibility.

Auch solltest Du überlegen ob diese VB6 Herangehensweise einer modernen UI entspricht.

S
sharpType Themenstarter:in
228 Beiträge seit 2009
vor 13 Jahren

Setze erstmal das MoreOptions Panel/Groupbox Visible auf false, setze die breite und danach dann die Visibility.

Werde ich gleich mal probieren, dennoch bleibt z. B. beim ziehen dieser Liste:

s. Anhang

diese gewisse Zähigkeit, praktisch das, was gezeigt wurde in der Hauptform und dem More-Button bzw. dem this.width+=300. Jedoch kann ich bei der Liste temporär nichts ausblenden, denn es soll sich ja dynamisch beim ziehen flüssig anpassen. Es sieht aber immer so "gequält" aus beim Resize der Liste. Es flackert zwar zum Glück nichts mehr, aber performant ist was anderes z. B. der dotNET-Reflector 🤔

Auch solltest Du überlegen ob diese VB6 Herangehensweise einer modernen UI entspricht.

Was ist damit gemeint? Diese GUI ist bewusst so aufgebaut,da ich Programme für CATIA V5 entwickel und die Funktionen ähnlich aussehen sollen, dass sie für die Endanwender einen hohen Widererkennungswert haben.

Dankeschön.

Gelöschter Account
vor 13 Jahren

Was ist damit gemeint? Diese GUI ist bewusst so aufgebaut,da ich Programme für CATIA V5 entwickel und die Funktionen ähnlich aussehen sollen, dass sie für die Endanwender einen hohen Widererkennungswert haben.

Auch Catia V5 geht langsam den Evolutionären weg der UI und verwendet meines Wissens in neueren Versionen bereits die von Office bekannten Ribbons.

Das gleiche wird auch für dessen Optionsmenus usw passieren, wenn es nicht bereits schon passiert ist.

Daher ist dein Ansatz bereits jetzt veraltet und fühlt sich daher staubig an.

Fakt ist, deine Anwender verwenden Windows und wenn du dich nicht an die WindowsUI hälst, hast du schon verloren 😃 unabhängig davon, ob die Anwender auch ein Tool verwenden, das nicht diesen Standard einhält.

passend zu diesen vorliebenspielchen: http://www.joelonsoftware.com/items/2007/06/12.html

Gelöschter Account
vor 13 Jahren

FZelle hats ja schon gesagt, dahinter steht das WindowsAPI und es werden haufenweise Refresh/Paint Nachrichten verschickt während deiner += 300 Aktion.
Mit Spy++ kannst du das sehr schön beobachten, es gibt Möglichkeiten das neuzeichnen mittels Api Befehlen temporär abzuschalten und nach deiner Aktion wieder zu aktivieren. Einfach kurz mal googlen.

S
sharpType Themenstarter:in
228 Beiträge seit 2009
vor 13 Jahren

Auch Catia V5 geht langsam den Evolutionären weg der UI und verwendet meines Wissens in neueren Versionen bereits die von Office bekannten Ribbons.

Also zu V6 kann ich nicht viel sagen, habe es nur kurz gesehen, aber da sieht die Oberfläche nur mager erneuert aus, aber in V5 ist alles noch sehr sehr "alt" und da kommt Forms mit dieser Methode am besten nach. Habe noch nie irgendwelche Ribbon-Elemente in V5 gesehen und arbeite mit V5 schon seit 5 Jahren. Die haben meistens wissen, also Dassault System, auch ihre eigenen Design-Elemente und wollen auf keinen Fall ihre Lösungen irgendwo anders wiederfinden. Aber darüber lässt sich bestimmt Streiten.

Frage: Es wird hier ja von veralteter Methode gesprochen. Wenn ich eine einfache FOrm habe mit einer Listeund paar Buttons, s. oben, wie wäre denn eine moderne FOrms-Methode, um dies zu realisieren?

Fakt ist, ich danke erstmal und versuche mal das in den Griff zu kriegen, und schaue auch mal mit Spy++ drüber. Vielen Dank erstmal! 🙂

Gruß

1.378 Beiträge seit 2006
vor 13 Jahren

Nachdem du nicht jetzt soooo viele Controls auf deinem Formular hast, wirds nicht daran liegen. Auch das "+=300" wird wohl kaum das System so in die Knie zwingen. Das einzige was mir dazu einfällt ist dass du mal alle SizeChanged oder LocationChanged Eventhandler zu kontrollieren was die so machen.

wie sieht dein Layouting aus? Berechnest du irgendwelche Größen und Positionen manuell? Von daher kann schon mal vorkommen, dass eine Größenänderung in einer anderen resultiert und sich so die Events extrem oft gegenseitig aufrufen.

Lg XXX

Gelöschter Account
vor 13 Jahren

Habe noch nie irgendwelche Ribbon-Elemente in V5 gesehen und arbeite mit V5 schon seit 5 Jahren.

Oh, ja du hast recht es sind meist die Module, die Moderne Oberflächen nutzen.

Die haben meistens wissen, also Dassault System, auch ihre eigenen Design-Elemente und wollen auf keinen Fall ihre Lösungen irgendwo anders wiederfinden.

IBM hat auch ihr eigenes Design. Ändert jedoch nichts daran, das es ultra-hässlich ist und es ein graus für jedermann ist, mit IBM Software arbeiten zu müssen, da sich diese Designs weitab der menschlichen Wahrnehmungs-Schemas bewegen....

Es wird hier ja von veralteter Methode gesprochen. Wenn ich eine einfache FOrm habe mit einer Listeund paar Buttons, s. oben, wie wäre denn eine moderne FOrms-Methode, um dies zu realisieren?

Hierzu kannst du dich ja erstmal mit ein paar grundlegenden Ui-Design Themen beschäftigen 😃

Ich hatte mal irgendwo einen richtig guten guide für die best practice gesehen... konnte ihn aber auf die schnelle nicht wiederfinden.

S
sharpType Themenstarter:in
228 Beiträge seit 2009
vor 13 Jahren

IBM hat auch ihr eigenes Design. Ändert jedoch nichts daran, das es ultra-hässlich ist und es ein graus für jedermann ist, mit IBM Software arbeiten zu müssen, da sich diese Designs weitab der menschlichen Wahrnehmungs-Schemas bewegen....

Wie bereits gesagt, darüber kann man sich streiten! Wenn man einen Konstruktor, der 5 Jahre mit V5 konstruiert, vor einer neuen Oberfläche setzt, mal sehen was der zu dir sagt^^ ---> ergo, dass ist wieder ein anderes Ding und hat u. A. auch kaufmännische Gründe (Vermarktung, Corporate-Identity, Wiedererkennungswert bla bla bla). Führt also voll am Ziel jetzt grad vorbei, aaaaber generell stimme ich trotzdem zu.

Schade, dass du es nicht gefunden hast, werde aber selbst auch mal schauen. Ich hab grad auch mal mit suspend und resumeLayout gearbeitet und auch this.resizeredraw = false gesetzt. Es ist schon etwas performanter geworden, jedoch immernoch nicht ganz so schön.

wie sieht dein Layouting aus? Berechnest du irgendwelche Größen und Positionen manuell?

Nein, gar nichts. Habe zu Beginn der Fehlersuche alles rausgenommen (ja da war eine Abfrage drin, ob die Form über den Rand schaut). Da sind nur noch die Grouboxes mit den Elementen drauf. Und ich erzeuge die nicht mal, die sind schon vorher auf der Form, ich ändere nur die Breite der FOrm, damit die wieder sichtbar werden. Also im Designer, ist die Form praktisch schon mit den MoreOptions, jedoch beim start einfach verkleinert.

Gelöschter Account
vor 13 Jahren

aktuell bin ich über einen wahren Schatz bezüglich Usability gestolpert: Usability Guidelines