Ich versuche eine einfache Grafikanwendung in WPF C # zu erstellen. Der Zweck besteht darin, 10000 * 10000 Rechtecke mit einer Größe von jeweils 4 Pixeln zu zeichnen.
Ich habe die OnRender-Methode der Leinwand geändert, um die Rechtecke zu zeichnen. Zeichnungen werden für eine kleinere Anzahl von Rechtecken ausgeführt (z. B. 50 * 50 oder 100 * 100 Rechtecke zu je 4 Pixeln), aber es verlangsamt sich, wenn ich die Anzahl der Rechtecke erhöht habe. von Rechtecken.
Folgendes ist mein Code:
%Vor%Der obige Code benötigt mehr als eine Minute, um 1000 * 1000 Rechtecke zu zeichnen.
Gibt es eine Methode, um diesen Prozess schneller zu machen? Gibt es noch etwas anderes, das ich an dieser Stelle verwenden kann?
Danke.
Der Zweck ist, 10000 * 10000 zu zeichnen Rechtecke mit einer Größe von jeweils 4 Pixel.
Zeichne sie NICHT. So einfach. Das wären 40.000 bis 40.000 Pixel.
Die meisten sind nicht sichtbar. Sie dürfen also nicht gezeichnet werden. Zeichnen Sie grundsätzlich nur diejenigen, die in der Leinwand sichtbar sind. Wenn Sie die Größe ändern oder scrollen, streichen Sie trotzdem, dann machen Sie das gleiche - zeichnen Sie nur diejenigen, die sichtbar sind.
Virtualisierung ist hier der Schlüssel zur Performance. Nehmen Sie Dinge so früh wie möglich aus der Zeichnungsschleife heraus. Zeug, das per Definition nicht sichtbar ist, muss überhaupt nicht gezeichnet werden.
Die nächste Alternative wäre, keine Leinwand zu verwenden. Probieren Sie eine Bitmap aus. Bereiten Sie es in einem separaten Thread vor, und zeichnen Sie diesen gleichzeitig.
Sie sollten StreamGeometry dann ausprobieren. Ссылка
Für komplexe Geometrien, die nicht benötigt werden nach der Erstellung geändert werden, Sie sollten in Betracht ziehen StreamGeometry statt PathGeometry als eine Leistung Optimierung. StreamGeometry funktioniert wie PathGeometry, außer dass es nur über Verfahrenscode zu füllen. Der seltsame Name bezieht sich auf ein Implementierungsdetail: Weniger verwenden Speicher (und weniger von der CPU), sein PathFigures und PathSegments sind eher als kompakter Byte-Stream gespeichert als ein Diagramm von .NET-Objekten.
Zitat aus Adam Nathans Buch WPF Unleashed.
Sie müssen den Pinsel nicht für jede Iteration der Schleife neu erstellen, da sie immer wieder dieselbe Farbe verwenden:
%Vor%Dies kann die Schleife ein wenig beschleunigen.
Der Bitmap-Ansatz könnte sich mehr beschleunigen - BitmapSource verfügt über eine Create-Methode, die Rohdaten entweder als Array oder als Zeiger auf unsicheren Speicher nimmt. Es sollte ein bisschen schneller sein, Werte in einem Array zu setzen, als tatsächliche Rechtecke zu zeichnen - allerdings müssen Sie die Pixelformate überprüfen, um die einzelnen Pixel richtig einzustellen.
Versuchen Sie vielleicht, die Zeichenfläche mit einem VisualBrush zu überlagern.
Fügen Sie diesem VisualBrush einfach das 4 * 4-Rechteck hinzu und lassen Sie es im Kachelmodus wiederholen. Alternativ könnten Sie einfach die Linien hinzufügen, so dass es die Kanten des Rechtecks nicht überlappt ... Ihre Wahl:)
Ihr Problem liegt in der Erstellung des Pinsels ... Ein Testlauf hat gezeigt, dass dieser Code
ist %Vor%dauerte 53 Sekunden. Sie versuchen, 100.000.000 Pinsel zu erstellen :) Wenn es maserbar ist, verwenden Sie einen gemusterten visuellen Pinsel, wenn es nicht strukturierbar ist ... suchen Sie nach einer anderen Lösung. Der Aufwand für das Speichern dieser vielen Pinsel im Speicher liegt in den Gigabyte