Implementieren Sie schnellere Grafikoperationen in WPF Canvas

7

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.

    
Vinod Maurya 25.10.2010, 05:56
quelle

6 Antworten

11
  

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.

    
TomTom 25.10.2010, 06:23
quelle
3

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.

    
Prince Ashitaka 25.10.2010 07:04
quelle
2

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.

    
Fredrik Mörk 25.10.2010 06:12
quelle
2

Noch ein Tipp darüber, was alle schon gesagt haben, dass die Stifte und Pinsel eingefroren sind - wenn Sie den Pinsel Aufruf Freeze vor der Verwendung erstellen (Pinsel aus der Brushes-Klasse (Brushes.White) sind bereits eingefroren) / p>     

Nir 25.10.2010 07:38
quelle
1

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.

    
Rune Andersen 25.10.2010 07:49
quelle
0

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

    
TerrorAustralis 25.10.2010 06:02
quelle

Tags und Links