2016-03-06 4 views
6

Ich habe eine TextBlock in einem 3D-Panel (Planerator) und ich verwendete eine Storyboard, um es zu animieren. (als Crawl-Text)WPF 2D in 3D-Ansicht Animationen: Performance-Problem

Wenn das Sichtfeld 1 ist, funktioniert alles gut, aber wenn ich das Sichtfeld auf mehr als 50 einstellen, wird die Bildrate stark abfallen und das Rendern wird abgehackt sein.

Ich habe die CompositionTarget.rendering verwendet.

Bitte beachten Sie die folgenden Bilder:

enter image description here

enter image description here

Ich muss 2D-Animationen in 3D-Ansicht mit einer guten Leistung.

Bitte sagen Sie mir, wie kann ich dieses Problem lösen? Sollte ich WPF verlassen und zur DirectX gehen?

UPDATE 1: Dies ist a sample project

Ich will nur ONE 2Dtext im 3D-Raum bewegen, aber die Leistung ist schlecht (Rendering ist nicht glatt es abgehackt)

..

UPDATE 2:

Dies ist die sample project aktualisierte Version auf cokeman19 Antwort basiert. (Die Leistung haben ~ 10 Frames verbessert worden, aber ich brauche zu perfektionieren Rendering)

UPDATE 3:

Schließlich bekam ich eine akzeptable Leistung mit Hilfe der Antwort des cokeman19 und die Inhalte this page.

+1

Wenn Sie wirklich planen, eine Menge 3D-Animation zu tun, sollten Sie dx verwenden, animieren direkt mit wpf kann eine Leistung Schwein sein. –

+1

Können Sie Ihren XAML posten? – auburg

+1

Ich hasse es normalerweise, aber zu dieser Zeit ist es wirklich schwierig, etwas ohne echtes Projekt oder etwas ähnliches zu sagen. Ich denke, Sie haben zu viele Neuaufzeichnungen irgendwo oder Grafiken mit Logik zu eng verbunden, so dass auf jedem Render muss es etwas Arbeit zu tun. Überprüfen Sie bitte auch diesen Artikel https://blogs.msdn.microsoft.com/karstenj/2006/10/16/wpf-3d-performance-troubleshooting/ –

Antwort

3

Ich bin mir nicht sicher, ob es nur ein Nebenprodukt der Beispiel-App ist, aber unter Planerator.CreateVisualChild() scheint es nicht notwendig zu sein, die GeometryModel3D.BackMaterial einzustellen. Als Referenz:

VisualBrush vb = new VisualBrush(_logicalChild); 
SetCachingForObject(vb); // big perf wins by caching!! 
Material backMaterial = new DiffuseMaterial(vb); 
... 
GeometryModel3D backModel = new GeometryModel3D() { ..., BackMaterial = backMaterial }; 

Die BackMaterial ist ein VisualBrush Wrapper um das logische Kind, das auf die visuelle Struktur nicht gehört, so Rendering scheint nicht sinnvoll, hier zu machen. Darüber hinaus ist das logische Kind (die LayoutInvalidationCatcher Klasse), wiederum ein Wrapper um die visuelle Kind, die bereits gerendert wird (mit _logicalChild) in der Einstellung frontModel.Visual.

Das Entfernen des Codes für die Erstellung und Einstellung von BackMaterial bringt den FPS auf ~ 55.

Darüber hinaus, wenn es eine Option ist, die Einstellung der folgenden bringt die FPS zurück auf 60, ohne merkliche Verschlechterung der Qualität.

RenderOptions.SetEdgeMode(_viewport3d, EdgeMode.Aliased); 

Update:

Die einzige andere Verstärkung ich in der Lage war zu machen war die CacheMode-BitmapCache zu setzen, die für Ihre Bedürfnisse nicht appliable sein kann.

Sogar auf meiner langsamsten Maschine erlaubte dies maximale FPS, aber es gibt einige Nachteile. Da die Zoomstufe im Textelement so hoch ist und diese Technik ein Bild zur Verwendung in der Animation erstellt (anstatt das UIElement selbst zu animieren), musste ich die Skalierungsebene auf 20 setzen, bevor sie visuell nicht wahrnehmbar war. Dies hat natürlich auch Auswirkungen auf den Speicher.

+0

Du hast recht, ich danke dir sehr viel . Es braucht nicht das BackMaterial. Aber mit den Änderungen, die Sie sagten, nur ~ 10 Frames waren besser. (nicht bis 60) Ich erwarte, einen 2Dtext im 3D Raum zu animieren, um 60 Rahmen zu erreichen. So warte ich auf eine bessere Antwort. Der Beispielquellcode wurde gemäß Ihren Empfehlungen aktualisiert. –

+0

Ich habe meine Antwort aktualisiert, um eine zusätzliche Option hinzuzufügen. – cokeman19

+0

Ich dachte nicht, dass der 'BitmapCache' so effektiv ist, und ich dachte fälschlicherweise, dass es auf den' TextBlock' angewendet werden sollte. (Ich habe bessere Ergebnisse mit der Schriftgröße und reduzieren Sie die Skalierung.) Jetzt kann ich Ihre Antwort akzeptieren. Vielen Dank . –