Wie verbessern Canvas-rendering-performance?
Ich haben, ziehen eine Menge Form (etwa 1/2 hundert tausend) [Leinwand][2]'s Kinder. Ich mache das in meiner WPF-Anwendung, die das teilen der Arbeit in zwei Teile: das erste, was ich Formen, indem Sie die Eigenschaften von jedem von Ihnen (wie Rand, Füllung, Breite, etc...) habe ich nach dem hinzufügen von Formen, wie Leinwand Kinder.
MyCanvas.Children.Add(MyShape)
Nun möchte ich zur Verbesserung der Leistung des zweiten Teils, denn wenn ich zeichne die Formen, die meine Anwendung blockiert wird für eine lange Zeit. Also ich habe versucht, die Dispatcher und seine Methode [BeginInvoke][4] mit anderen [Prioritäten][5]: nur, wenn ich den Hintergrund-Priorität, die die Hauptanwendung nicht zu blockieren, da sonst die Anwendung blockiert bleibt und die "Bild" wird nicht angezeigt, bis alle Formen werden Hinzugefügt, um meine Leinwand, aber wenn ich die Hintergrund-vorrangig natürlich alles, was langsamer ist. Ich habe auch versucht ein neues Thema erstellen, anstatt die Dispatcher, aber es wurde keine signifikante Veränderung.
Wie kann ich dieses problem beheben und verbessern allgemein die performance meiner Anwendung, wenn ich meine Formen auf die Leinwand?
Dank.
Nein. Könnten Sie mir ein Beispiel für die Verwendung von DrawingVisual statt einer Form wie Ellipse oder Pfad. Zum Beispiel, wie kann ich auf meine Leinwand dieser Weg mit DrawingVisual?
Ja, es gibt einige große Informationen über google. Hier ist ein link zum Einstieg: msdn.microsoft.com/en-us/magazine/dd483292.aspx
Dies ist ein einfacher Beispiel, aber die, die sich auf hit-testing und nicht erklären, warum so gut wie die vorherigen link. msdn.microsoft.com/en-us/library/ms771684.aspx
Ich lese den ersten Artikel, aber ich sah auf der MSDN-Bibliothek, die DrawingVisual keine Veranstaltung handlig! Muss ich die Interaktion mit meinen Formen, ist es sehr wichtig, zu Fang die Maus-Ereignisse für mich.
InformationsquelleAutor gliderkite | 2012-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden müssen Visuelle Objekte anstelle von Form; insbesondere, wie vorgeschlagen, DrawingVisual: ein visual-Objekt, das zum Rendern von Vektor-Grafiken. In der Tat, wie geschrieben steht in der MSDN-Bibliothek:
So, zum Beispiel, um ein DrawingVisual, enthält ein Rechteck:
Um DrawingVisual-Objekte, müssen Sie einen host zu erstellen-container für die Objekte. Die host-container-Objekt muss die Ableitung von der FrameworkElement-Klasse, die für die layout-und event-handling unterstützen, dass die DrawingVisual-Klasse fehlt. Beim erstellen einer host-container-Objekt für visual objects, müssen Sie zum speichern der visuellen Objekt-Referenzen in einer VisualCollection.
Den event-handling-routine kann dann implementieren Treffer Tests durch aufrufen der HitTest Methode. Die Methode ist HitTestResultCallback parameter bezieht sich auf eine benutzerdefinierte Prozedur, die Sie verwenden können, um zu bestimmen, die daraus resultierende Aktion eines Treffer-test.
Also, was ist auf den Griff hundert tausend Vektor-Grafik-Elemente?
Siehe Fragen-und-ich verlinkt: stackoverflow.com/questions/8713864/...
Bitmap Raster-Grafiken
Richtig, Vektor-Grafik-Implementierungen sind ineffizient und nicht geeignet, um hohe Objekt zählt. Weit besser sind immediate mode-APIs, wie z.B. Bitmap-oder DirectX-basierte Renderer. Glauben Sie mir, ich habe mit WPF seit Jahren und die beste, die ich bekommen habe aus ist es rund 5.000 visuals auf dem Bildschirm zu jeder Zeit. Mehr als das, und es ist völlig umfällt!
InformationsquelleAutor gliderkite
Vereinbart, dass, wenn Sie wollen, ziehen Millionen von Elementen, Sie kann es einfach nicht in WPF. WriteableBitmapEx wie bereits erwähnt ist eine gute alternative.
Sehen in diesem Zusammenhang Frage die geht in die Tiefe auf high-performance-Grafik in WPF und die verfügbaren alternativen.
Wenn Sie einfach verwenden muss, Leinwand, überprüfen Sie heraus dieses ZoomableApplication2 - Eine Millionen Artikel. Dies ist eine Canvas-basierte demo, die macht starken Gebrauch von Virtualisierung um angemessene Leistung mit 1.000.000 UIElements, die auf eine Leinwand.
InformationsquelleAutor Dr. ABT
Dass viel von UIElements und wohl auch nicht geben die Art von Leistung, die Sie suchen. Sie müssen in der Lage sein, um die Interaktion mit jedem der Elemente, die Sie Rendern? Wenn nicht, würde ich dringend empfehlen, sich in
WriteableBitmap-Objekt
statt. Wenn Sie brauchen, um Formen zu zeichnen und nicht wollen, um alle, dass die Logik selbst (wer will?), überprüfen Sie heraus dieWriteableBitmapEx
- Projekt über auf CodePlex.Ich würde nicht mit der Form, die ich verwenden würde, DrawingVisual. Hinzufügen Sie können diese Angaben, um Ihre Frage bitte? Ich werde darüber nachdenken und revidiere meine Antwort.
InformationsquelleAutor Drew Marsh
Dies kann etwas nicht, und ich entschuldige mich, wenn Sie auf diese Weise fühlen, aber in der Hoffnung, dass Sie etwas Licht für andere Benutzer, ich Teile diese Leckerbissen.
Hatten wir einige performance-Probleme mit einem Canvas-Steuerelement verwendet für die Erfassung von Unterschriften. Das einfangen war sehr zackig, und wir konnte nicht zeichnen geschwungene Linien als Ergebnis. Es stellte sich heraus, dass in Bezug auf einen Stil war die Generierung von drop-Schatten auf der UI-Elemente. Deaktivieren Sie das drop-Schatten-Effekt löste unser problem.
InformationsquelleAutor Yves Rochon