Leistung von DrawingVisual vs Leinwand.OnRender für viele von sich ständig ändernden Formen
Arbeite ich an einem Spiel-wie app, die hat bis zu tausend Formen (Ellipsen und Linien), die sich ständig ändern, bei 60fps. Das Lesen einer exzellente Artikel auf die rendering-viele bewegliche Formen, implementiert habe ich dies über eine benutzerdefinierte Leinwand Nachkomme, überschreibt OnRender
zu tun, die Zeichnung über einen DrawingContext
. Die Leistung ist Recht vernünftig, obwohl die CPU-Auslastung bleibt hoch.
Aber der Artikel lässt vermuten, dass die meisten effizienter Ansatz für ständig in Bewegung Formen ist die Verwendung von viel DrawingVisual
Instanzen statt OnRender
. Leider, obwohl es nicht erklären warum, dass schneller sein soll für dieses Szenario.
Ändern der Umsetzung in dieser Art und Weise nicht eine kleine Anstrengung, also würde ich gerne die Gründe verstehen, und ob Sie anwendbar sind, um mich vor der Entscheidung für die Umstellung zu machen. Warum konnte die DrawingVisual
Ansatz führen zu einer geringeren CPU-Auslastung als die OnRender
Ansatz in diesem Szenario?
InformationsquelleAutor Roman Starkov | 2010-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich dachte Petzold erklärt in diesem Absatz;
Baut auf einem früher Erklärung;
Ist es das, was Ihr zu Fragen?
Durch die Art und Weise, diese ist eine relativ neue high-performance-WPF tutorial, viele Zehntausende der Punkte im plot, es ist 3D-gerenderten und animierten auch (sogar Maus-input zu fahren, einige der Transformationen).
DrawingVisual
Ansatz nur gesagt, um die "beste" Methode für diese Besondere Szenario - wo viele Punkte ändern, aber nicht die ganze Menge. Wenn sich alles bewegt (was bei mir der Fall)OnRender
klingt wie der beste Ansatz. Netter link - danke.Es ist ein weiterer Ansatz, die ich gefunden haben, es zu sein, die beste Leistung für mutierend eine app mit "viel von sich ständig ändernden Formen," welche war die OP ' s Frage. Ihre app manipulieren kann, einen Baum von DrawingGroups. Sie müssen nur anrufen RenderOpen/DrawDrawing einmal bei app-Start auf die Wurzel dieses Baums. Von da an, WPF Hinweise alle änderungen an den Baum und updates automatisch, inklusive Transformationen und einfügen/entfernen von tief verschachtelten DrawingGroup Kinder. Sie benötigen eine Daten-Struktur, die tracks/verwaltet den Zustand des Baumes. Siehe mein Kommentar bei stackoverflow.com/a/716469/147511.
InformationsquelleAutor RandomNickName42
Pro WPF in C# 2008:
Was es läuft darauf hinaus, dass jeder einzelne von denen, Ellipsen und Linien, die Sie erstellen, ist eine separate
FrameworkElement
; das heißt, es unterstützt nicht nur die Treffer-Test, aber auch layout, input, focus, Ereignisse, Stile, Datenbindung, Ressourcen und animation. Das ist eine ziemlich schwere-Gewicht-Objekt für das, was du versuchst zu tun! DieVisual
Objekt überspringt alle, und erbt direkt vonDependencyObject
. Es bietet weiterhin Unterstützung für hit-Prüfung, Koordinaten-transformation, und bounding-box-Berechnungen, aber keiner von den anderen Sachen, dass die Formen der Unterstützung. Es ist viel leichter und würde wahrscheinlich verbessern Sie Ihre Leistung ungemein.EDIT:
Ok, habe ich falsch verstanden, deine Frage das erste mal um.
In dem Fall, dass Sie
OnRender
, es hängt wirklich, wie Sie erstellen die Grafik und Anzeige. Wenn Sie eineDrawingContext
und hinzufügen aller Bilder zu einem einzigen element, das ist nicht anders als mit derDrawingVisual
Ansatz. Wenn Sie erstellen ein separates element für jedeVisual
erstellt, dann wäre dies ein problem. Es scheint mir, dass Sie die Dinge auf die richtige Art und Weise.Warten Sie, warten Sie, ich bin nicht die Schaffung einer FrameworkElements! 🙂 Ich bin mit
OnRender
+DrawingContext
sofern DrawingContext erstellt eine Reihe von FrameworkElements hinter die kulissen (was ich bezweifle), dies ist nicht der Fall.Mein schlechtes. Hinzugefügt edit. 🙂
Der edit ist auch falsch, wenn mit DrawingContext-rendering-erstellen Sie keine Visual, ziehen Sie einfach Formen, ohne dass eine Referenz.
InformationsquelleAutor Charlie
Jedermann in die Antworten, haben es falsch. Die Frage ist, ob das Rendern Formen direkt in der Zeichnung Kontext ist schneller als das erstellen von DrawingVisual. Offensichtlich ist die Antwort "ja". Funktionen wie DrawLine, DrawEllipse, DrawRectangle etc. erstellen Sie nicht jedes UI-Element. DrawingVisual ist viel langsamer, weil es ein UI-Element erzeugen, obwohl ein leichtes. Die Verwirrung in den Antworten ist, weil die Leute Sie einfach kopieren/einfügen der DrawingVisual besser abschneidet als deutliche UIElement Formen Anweisung von MSDN.
Der DrawingContext nicht alles neu zeichnen, weil WPF hat ein beibehalten Zeichnung Modell. DrawingVisual enthält Logik, die Steuern, ob oder nicht es sollte Neuzeichnen des Visuellen. Implementieren Sie können die gleiche Logik in OnRender () - Methode und zeichne nur, wenn es notwendig ist. WPF wird nicht erlöschen Ihrer Zeichnung auf 60 fps, OnRender() nur aufgerufen wird, wenn Sie anrufen InvalidateVisual() oder, wenn WPF-muss erlöschen Ihrer Zeichnung.
InformationsquelleAutor user275587
In meinen tests jedoch (panning Animationen), ich merke keinen Unterschied in der Geschwindigkeit. Ich würde sagen, dass die Verwendung eines host-element für viele Zeichnung Grafik ist ein bisschen schneller. Dieser Ansatz, wo Sie bauen Ihre visuelle Struktur mit vielen visuals gibt Ihnen mehr Kontrolle. Außerdem, wenn Sie wollen, eine komplexe Treffer Tests, die Filterung ist schneller, da können Sie überspringen ganze "äste" der visuals
InformationsquelleAutor Theodore Zographos