Schneller WPF-Partikel-Hintergrund

8

Ich erstelle eine WPF-Anwendung und möchte, dass ihr Hintergrund mit particles mit Zufallsvariablen gefüllt wird:

  • Opazität / z-Reihenfolge
  • Größe
  • Geschwindigkeit
  • " Unschärfe " (Unschärfeeffekt)
  • Wegbeschreibung (oder Pfad)

Ich habe ein wirklich gutes Beispiel dafür gefunden, was ich tun würde wie es sein soll, aber leider ist es in Flash und es ist nicht kostenlos ...

Ich habe versucht, es zu implementieren, aber ich bekomme es nicht glatt ...

Ich habe mich also gefragt, ob einer von euch mir helfen könnte, ihn zu verbessern, um weniger CPU und mehr GPU zu verwenden, damit er auch bei mehr Partikeln und im Vollbildmodus glatter ist.

Code "Particle.cs" : Die Klasse, die ein Partikel mit all seinen Eigenschaften definiert

%Vor%

XAML "Window1.xaml" : Der Xaml-Code des Fensters besteht aus einem radialen Hintergrund und einem Canvas-Bereich, in dem Partikel gehostet werden

%Vor%

Code "Window1.xaml.cs" : wo alles passiert

%Vor%

Vielen Dank!

    
ZogStriP 13.04.2009, 02:34
quelle

9 Antworten

2

Erich Mirabal & gt; & gt; Ich habe versucht, HLSL und es war ziemlich lustig, etwas Neues zu lernen, aber da ich ein totaler Neuling bin, schaffte ich es nicht, eine Box / Gaußsche Unschärfe zu machen ...

Jedenfalls habe ich einen Weg gefunden, der überhaupt keine CPU benötigt.

Anstatt die Ellipse zu bewegen, bewege ich ihr Bild.

Ich erzeuge ein In-Memory-PNG mit den Klassen RenderTargetBitmap und PngBitmapEncoder und verschiebe diese bereits unscharfen und transparenten Bilder!

Vielen Dank an alle für die Antwort!

    
ZogStriP 15.04.2009, 01:08
quelle
4

Ich glaube nicht, dass das Problem Leistung ist. Die App kommt nicht annähernd an meine CPU heran, aber die Bildrate sieht immer noch nicht glatt aus.

Ich würde zwei Dinge betrachten. Wie Sie Ihre Positionsaktualisierung berechnen und wie oft Sie das Ereignis auslösen.

%Vor%

Das sind 100 Bilder pro Sekunde. Wählen Sie stattdessen 30fps (jede andere Aktualisierung auf Ihrem Monitor) oder 60 usw. Sie sollten versuchen, Ihre Aktualisierungen synchron mit Ihrem Monitor durchzuführen, wie es bei einem Videospiel der Fall wäre.

%Vor%

Das allein wird wahrscheinlich die Sanftheit nicht lösen. Sie sollten auch nicht davon ausgehen, dass die Zeit zwischen den Ereignissen fest ist:

%Vor%

Während Sie einen Zeitgeber feuern, um das Update alle 0,01 Sekunden durchzuführen, bedeutet das nicht, dass es tatsächlich in einer konsistenten Menge an Zeit ausgeführt wird. Garbage Collection, OS Scheduling, was auch immer die Zeit beeinflussen kann. Messen Sie die verstrichene Zeit seit der letzten Aktualisierung und führen Sie die Berechnung anhand dieser Nummer durch.

Viel Glück!

    
John Noonan 14.04.2009 06:45
quelle
1

Wenn ich Sie wäre, würde ich mir das integrierte WPF-Animationssystem ansehen, anstatt die Positionen manuell zu aktualisieren, indem Sie einen Rückruf verwenden. Zum Beispiel könnte es sich lohnen, unter anderem in die Klasse Point3DAnimation im Namensraum System.Windows.Media.Animation zu schauen. Auf einer separaten Anmerkung sieht es nicht so aus, als würde die Verwendung von 3D-Punkten tatsächlich irgendetwas kaufen (soweit ich das beurteilen kann, ignorierst du die Z-Werte, wenn die Ellipsen tatsächlich gerendert werden) Point s

    
kvb 13.04.2009 04:30
quelle
1

Die MSDN WPF hat eine nette Particle-Effects-Demo. Auch das O'Reilly-Buch Learning XNA befasst sich mit der Verwendung von Partikeleffekten mit XNA.

    
Chris Morley 19.04.2009 16:03
quelle
1

Ich habe Ihr Problem gelöst, indem Sie die Zeile ellipse.Effect entfernt haben und stattdessen Window1.xaml

hinzugefügt haben %Vor%

Zugegeben, es hat nicht das gleiche Aussehen, wenn sie ihren eigenen Unschärfe-Radius haben.

    
Bryan 17.05.2009 18:45
quelle
1

Danke an alle, die mir antworten.

Ich habe jede Ihrer Antworten berücksichtigt:

  • Lucas Aardvark & gt; & gt; Ich habe das gemacht und es hat ein wenig die Geschwindigkeit der Anwendung erhöht und weniger CPU / Speicher verbraucht.
  • Rob Walker & gt; & gt; Ich folgte dem Link, aber ich stoppte, als ich sah: " Der Emulator ist ziemlich CPU-intensiv aufgrund der Null-Optimierung und viele Array-Kopien".
  • kvb & gt; & gt; Ich habe versucht, Animationen zu verwenden, aber es war viel komplexer und hat die Glätte der Anwendung nicht verbessert ... Vielleicht habe ich es falsch gemacht! Ich habe auch die Verwendung von Point3D entfernt, da es praktisch nicht nötig war, sie zu verwenden
  • Jogn Noonan & gt; & gt; Wirklich anweisende Antwort, aber ich bin mir nicht sicher, dass das helfen wird. Wenn ich die Zeit zwischen 2 Aktualisierungen messe, dann ist das Verhältnis umso größer, je länger es ist. Also werden Partikel wie "teleportiert" sein, richtig?

Ich habe meinen Quellcode aktualisiert:

Die Klasse Partikel hat jetzt nur noch die folgenden Eigenschaften:

%Vor%

Das Window1.xaml hat sich nicht geändert, aber ich habe seinen Hintercode geändert:

%Vor%

Wenn Sie diese neue Version ausprobieren , werden Sie feststellen, dass sie immer noch nicht glatt ist .

Aber wenn Sie die Linie kommentieren, die den Weichzeichner-Effekt betrifft, sehen Sie, dass es sehr glatt geht!

Irgendwelche Gedanken?

    
ZogStriP 14.04.2009 13:23
quelle
0

Ich habe jemandes Blog gelesen, der versucht hat, dasselbe zu tun, aber ich kann es nicht finden (ich werde weiter danach suchen). Die Art, wie er seine Bewerbung beschleunigen konnte, bestand darin, Partikel wiederzuverwenden. Sie sehen jedes Mal, wenn Sie ein neues Partikel erstellen, Ihre Speicherkapazität. Sie können sich diesen Speicher nicht leisten, es sei denn, Sie haben ein verrücktes System, weil .NET viel Speicher verwendet.

Die Lösung: Wiederverwendung von Partikeln, sobald ein Partikel nicht mehr auf dem Bildschirm ist, wird entweder der Speicher freigegeben (wahrscheinlich nicht wegen GC) oder das Partikel unten neu positionieren und wiederverwenden .

    
Kredns 13.04.2009 03:00
quelle
0

Nicht sicher, ob das besser funktionieren würde, aber jemand hat einen Silverlight C64-Emulator zusammengestellt, und die Technik, die er verwendet, ist im Grunde genommen Zeigen Sie einen Film mit einer benutzerdefinierten Quelle (Ihrem Code) an, die die Frames bereitstellt.

Der Vorteil ist, dass Sie bei der Anzeige der Bilder Rückrufe erhalten und sich so an die tatsächliche Wiedergaberate anpassen können. Ich bin mir nicht sicher, wie gut dies für höhere Auflösungen funktionieren würde, aber das C64-Beispiel hat nur einen Bildschirm mit niedriger Auflösung zum Emulieren.

    
Rob Walker 13.04.2009 03:03
quelle
0

Hast du einen ShaderEffect mit HLSL gemacht, um das Rendern auf der GPU zu machen? Sie könnten einen PixelShader schreiben. Hier sind einige andere Beispiele von einem der Ankündigungen und es hat auch einige nette Links. Es sollte auf jeden Fall glatt in der Wiedergabe sein.

    
Erich Mirabal 14.04.2009 13:29
quelle

Tags und Links