Das Einblenden dauert unter XP ist zwar schon besser. Aber es dauert immer noch lange genug um ein deutliches ruckeln der Animation erkennen zu können. Für 200-300ms ausgelegt dürfte es gefühlt 1-1,5 Sekunden dauern.
Möglichkeit wäre zu messen wie lange das Zeichnen dauert. Wenn es einen gewissen Grad überschritten hat, dann wird das Überblenden abgebrochen und der Film wird beim nächsten Zeichnen vollständig gezeichnet. Das ColorBlending auf ein FarbBlending umzustellen dürfte wohl nicht klappen, da es immernoch recht aufwendig berechnet werden muss und es wohl mit der Matrix nicht ganz so einfach zu lösen sein könnte.
Kommentare
Das Problem mit dem Messen
Das Problem mit dem Messen ist gar nicht so einfach. Denn wenn ohne ImageAttributes gezeichnet wird, dann sollte das Zeichnen immer schneller sein. Von daher muss man da wohl sagen, dass sollte das Zeichnen ein Mal langsamer sein als 100ms so muss es für die komplett Laufzeit der Anwendung deaktiviert werden.
Dann eventuell auch wieder 1-2 Blendstufen mehr einfügen. Damit das Einblenden auf Systemen die es schaffen etwas weicher wirkt.
Evetuell ist es auch nötig,
Evetuell ist es auch nötig, dass man die komplette Zeichenroutine umstellt. Und zwar, dass nicht die komplette ListView doppelt gepuffert wird sondern nur das einzelne Einträge oppelt gepuffert werden. Das würde beim Update eines Items auch dazu führen, dass nicht immer alle Einträge gezeichnet werden müssten sondern nur ein einzelner Eintrag. Was das wohl noch mal deutlich beschleunigen würde. Dazu muss beim Zeichnen eines Items ein BufferedGraphicsContext erstellt werden und dieser zum Zeichnen genutzt werden. Vielleicht hilft es ja.
http://msdn.microsoft.com/en-us/library/system.drawing.bufferedgraphics(v=vs.90).aspx
http://msdn.microsoft.com/en-us/library/system.drawing.bufferedgraphics_methods(v=vs.90).aspx
http://msdn.microsoft.com/en-us/library/ms141960(v=vs.90).aspx
So wie es scheint ist das
So wie es scheint ist das wohl nicht ganz so einfach zu lösen. Auf der anderen Seite ist es aktuell aber alles noch im Rahmen des erträglichen.
Das Zeichnen in der
Das Zeichnen in der Coveransicht ist ziemlich langsam. Da muss wohl in jedem Fall noch mal geschaut werden, ob das nicht eventuell noch etwas beschleunigt werden kann. Eventuell auch, ob es da noch eine andere alternative zu den ImageAttribs gibt. Die das vielleicht etwas besser beschleunigt.
Bei der Komponente müsste
Bei der Komponente müsste wohl verschiede Flags gesetzt werden und außerdem sollte das Event OnPaintBackground noch überschrieben werden. Damit das Zeichnen des Hintergrundes da nicht dazwischen schlägt.
ControlStyles.UserPaint ist
ControlStyles.UserPaint ist wohl nicht so gut. Denn damit müsste der komplette Inhalt der Komponente selbst gezeichnet werden. Also nicht nur den Inhalt der einzelnen Items sondern auch das Anwerfen der Items. etc. etc.
Das Zeichnen ist von diversen
Das Zeichnen ist von diversen Faktoren abhängig.
Werden Spalten des Headers von der Größe angepasst (selbst, wenn der Header nicht sichtbar ist) wird alles, was zu dieser Spalte gehört und alle nachfolgenden, neu gezeichnet.Da ich beim Resize die Spalten anpasse ist das irgendwie nicht so gut. Einzige "Lösung" hierfür wären fixe Spaltenbreiten. Fixe Spalten haben aber wieder Probleme.
In der Detailansicht wird nur der Bereich gezeichnet, der auch zu den Spalten gehört. Also müsste man beim Invalidate aufpassen in welcher Ansicht man sich befindet und im Zweifel muss man den Bereich (ItemRect) zum Zeichnen vergrößern. Sollte in einer Funktion GetItemRect schon automatisch berücksichtigt werden.Beim Vergrößern des Fensters wiederum wird der Bereich hinter den Spalten aber scheinbar mit gezeichnet (sofern FullRowSelect aktiviert ist).
Ein weiteres Problem ist das Verliehren/Erhalten des Fokus der ListView/Anwendung. Hierbei wird nur Bereich gezeichnet der auch von Spalten abgedeckt wird. Keine Ahnung wie man das richtig handhaben soll. Da müsste man wohl auf alle möglichen Events reagieren und entsprechend nachsteuern was das Zeichnen angeht. Es reicht nicht aus, wenn innerhalb des Zeichnens der Zeichenbereich erweitert wird, da von übergeordneten Instanz ein Bereich festgelegt wird. Alles außerhalb dieses Bereiches wird vom DoubleBuffering direkt verworfen, weswegen kleine sich geänderte Bereiche auch sehr schnell gezeichnet werden können.Man müsste auch das Klicken in die Listview erweitern. Hierbei zählt leider auch nur der Bereich der zu den Spalten gehört. Also im Falle eines Klicks hinter die Spalten müsste man selbst das Item suchen und aktivieren.Vielleicht sollte man auch die Größenveränderung der Spalten verbieten können, da bei jeder Veränderung neu gezeichnet würde. Es ist nur etwas doof, wenn das Fenster dann kleiner gemacht wird. Dann könnte man horizontal Scrollen. Was aber hoffentlich eh keine Auswirkung haben sollte.Sollte es klappen, dass sich die Items nicht mehr komplett neu zeichnen, dann muss beim Verändern der Breite des Fensters darauf geachtet werden, dass der recht Rand neu gezeichnet wird. Beim Verkleinern muss der Rand neu gezeichnet werden. Beim Vergrößern muss nur der Teil neu gezeichnet werden der Veränderung der Rand war. In der Tile Ansicht muss vorerst noch nichts berücksichtigt werden. Genau so wenig müssen Veränderungen der Höhe beachtet werden.Die graue Version der Bilder muss beim Laden der Filme vorberechnet werden. Das bei jedem Zeichenvorgang neu zu zeichnen ist unnötig aufwändig und wird in jedem Fall von der CPU erledigt. = Nicht gut. Das reine Blenden über einen festen Alphawert ist in der Regel unproblematisch (sofern das von der Grafikkarte erledigt werden kann)Auf Dauer sollte es wohl so sein, dass direkt zu Beginn der Anwendung ein Thread gestartet wird in dem erst einmal ermilltel wird wie schnell das Alphablending auf dem System vonstatten geht. Möglichkeit dafür wäre ein 1000x1000 Pixel großes Bitmap transparent auf ein anderes zu zeichnen. Dauert es länger als 40ms (??) somit ist die Geschwindigkeit nicht ausreichend um die Animationen flüssig darzustellen. Hierbei könnte man dann die Animationen deaktivieren oder gröber ausfallen lassen.Die FSK Kennung und das Medium sollten wohl auch vorab auf das Cover gezeichnet werden. Wenn diese nicht verfügbar sind oder eingeblendet werden, dann kann man das Cover durch die Kennungen erkennen. Das sieht nicht so gut aus.Zum Debuggen der Ausgaben sollte sich der Hintergrund der Einträge bei jedem Zeichnen verändern. Damit sollten grundlegende Probleme mit erträglichem Aufwand sichtbar gemacht werden können.
Nette Idee. Im Abgang nur
Nette Idee. Im Abgang nur leider etwas trocken. Dadurch, dass die ListView Gruppen benutzt wird bei jeder Größenänderung in jedem Fall immer komplet neugezeichnet. Lässt sich auch leider so überhaupt nicht verhindern. Damit ist die einzige Möglichkeit die bleibt, das Zeichnen so effizient wie möglich zu gestalten.
Die nicht realisierbaren Passagen wurden durchgestrichen. Der Rest ist aber gerade für ein optimiertes Zeichnen dennoch recht Sinnvoll.
Vielleicht ist es auch
Vielleicht ist es auch möglich mit den Windows Messages einige Dinge aus der ListView auszubügeln. Zum Beispiel,
Hier müsste man aber herrausfinden, ob es ohne weiteres überhaupt möglich ist solche Sachen vernünftig abzufangen, ohne sich dabei die komplette Komponente zu zerschießen.
XP-Support gibt es nicht mehr
XP-Support gibt es nicht mehr. Entsprechend sollte die Aufgabe noch mal neu bewertet werden. Bzw. Überprüft werden, ob der aktuelle Code auf Windows 7 bzw. 10 schnell genug ist. Wenn ja. Abhacken.
(Kein Betreff)
Ist mittlerweile alles
Ist mittlerweile alles schnell genug.
Statusänderung
Die Aufgabe wurde aufgrund von Inaktivität automatisch geschlossen.