Frage

Ich bin meine eigene Partikelsystem Motor entwerfen, ist dies für Lernzwecke, ich will nicht wirklich einen bestehenden Motor verwenden.

Im Moment erzeugen ich schön Partikel, aber ich mag den Motor Layout es einfacher zu machen, mit ihnen zu arbeiten.

Ich habe auf der Klasse "Particle Systems" gedacht,

diese Klasse würde enthalten die folgenden Hinweise:

particlesList . Eine Liste der Teilchen, die das System zusammenstellen

systemEmitter : Das System Emitter für die Partikel, sollte die Emitter Klasse in der Lage sein, mehrere Partikelemissionstechniken durchzuführen, wie beispielsweise Emittieren von Linien, Punkten, die zufällig aus einem Polygon zu emittieren. Auch diese Klasse soll Emission Controlling tun, wie auf einem Punkt zu emittieren, weg von einem Punkt, in eine Richtung und Zeit zu emittieren.

particleController : Leitet beispielsweise Drehung um einen Punkt, variable Teilchengrößen, variable Partikelfarben, Bereiche um das System, auf das die Partikel auf unterschiedliche Weise, die Kollisionserkennung (mit anderen Objekten oder innerhalb des reagieren Teilchen, wenn wird necesary).

Particle Renderer : Verantwortlich für die Erstellung dieses Systems, variable Blending Typen, Partikel Texturen, Partikeltypen wie Dreiecke, Kreise, benutzerdefinierte ...

Diese vier Elemente würde das Partikelsystem der Klasse zusammensetzen. Einige FX können mehr als ein Partikelsystem erfordern, zum Beispiel eines Feuer FX, ein System für das Feuer verwenden könnte, ein System für Rauch und ein System für die Funken.

Das ist, was ich in meinem Kopf, aber ich würde wirklich gerne wissen, ob diese Design-Ansatz gut ist, oder wenn Sie sehe ich bin etwas fehlt oder könnte / sollte etwas anderes tun. Ich habe nicht über einige einfache Möglichkeit gedacht zu „retten“ FX, wie zum Beispiel, was der beste Weg wäre, meinen Motor zu sagen, „Feuer ziehen“, „ziehen Explosion“, „zeichnen Brunnen“, etc, vielleicht FX Speichern von Informationen in xML-Dateien wäre eine gute Idee sein, etc ..

Meinungen sind sehr willkommen, und wie ich schon gesagt habe, ich möchte wirklich, dies zu bauen, anstatt einen anderen Motor verwenden, für das Lernen Gründen.

War es hilfreich?

Lösung

Dieses Set-up sollte in Ordnung sein. Was ich hoffe, dass Sie denken über ist, welche Daten ein Teilchen bilden, die in der Partikelklasse sein wird. Sie wollen nur das Nötigste haben, so dass Sie nur lesen müssen / schreiben so wenig Speicher wie möglich, wenn das System läuft.

Soweit Daten machen angetrieben, die nach vorne ziemlich gerade sein sollte. Ich würde eine XML und Binär-Format-Option für das Laden vor. so kann man Sachen leicht optimieren, während der Entwicklung (und nicht mit einem Werkzeug). Sobald Sie ein Werkzeug oder getan wird zwicken haben würde ich die xml, um binäre für schnellen Laden umwandeln.

Sie können auch eine Manager-Klasse wollen, die die Erstellung und Aktualisierung dieser Partikelsysteme behandelt. Dies würde es ermöglichen Ihnen auch einen Platz andere Funktionalität zu behandeln, die mit allen Systemen zu tun hat. Einige Beispiele hierfür ist die Begrenzung der Menge von Partikelsystemen oder Partikel, die aus Performance-Gründen verwaltet werden kann oder eine Kollisionsebene, die alle Systeme berücksichtigen sollten.

Sie nennen dies für Bildungszwecke ist und dass in Bezug auf diese Dinge ziemlich nit wählerisch sind (aber wichtig, wenn Sie diese in einem Spiel zu verwenden, die Partikel schwer ist).

Ich gehe davon aus das ist eine API wie DirectX oder OpenGL zu rendern. In dieser Hinsicht würde ich die Partikeleffekte alle teilen den gleichen Pool von Speichern für Ihre Vertexinformation. Diese helfen, die Rendering-Geschwindigkeit viel. Ich würde auch durch ein Partikelsystem zur Verwendung mit Stumpfes betroffenen Spur einer Grenze des Bereichs hält Culling (AABB oder Kreis).

Ein großer Teil ein Partikelsystem zu aktualisieren, ist, wie Attribute von einem Wert zu einem anderen gehen. Je dynamischer können Sie den Interpolationsstroke Werte machen, desto besser Ihre Effekte aussehen können. Interpolation von einfach linear gut genug sein könnte, aber es kann besser sein, ein dynamisches Diagramm zu haben, die die Werte verwendet wird, zu interpolieren. Zum Beispiel anstelle von 0-255 Blau in einem zweiten gehen, kann es kühl sein 0-128 in 0,2 Sekunden gehen dann 128-255 in 0,8 Sekunden. Fügte hinzu, dass wird erheblich die Möglichkeiten erhöhen, wie Sie Ihre Effekte aussehen.

Außerdem habe ich glaube, Sie haben eine ziemlich gute Vorstellung davon, was Sie tun möchten. Ihre Erwähnung machen verschiedene Arten von Partikeln sagt mir, Sie dies in der richtigen Art und Weise denken. Ich habe Leute machen Motoren auf Rendern eines Quad Billboard nur mit Schwerpunkt Teilchen gesehen. die Möglichkeit zu haben wirklich 3D-Geometrie zu emittieren, macht die Dinge sehen gut aus. Sie können sich auch darüber nachdenken, (falls dies noch nicht geschehen) die Möglichkeit, für Ihr System mit Modellinformationen zu nehmen und teilen dynamisch die es in einzelne Partikel emittiert werden. Eigentlich explodiert ein Modell sieht sehr besser als eine Explosion Teilchen anzeigt und das Objekt ausgeblendet oder auf einen beschädigten Zustand umgeschaltet wird.

Andere Tipps

Nur ein paar Ideen für die Optimierung von einfachen 2D-Sprite-Partikeln.

Eine gute Idee ist es, alle Teilchen in einem Vertex-Array / VBO zu senden, und einen Vertex-Shader verwenden, um ihre Positionen im Laufe der Zeit zu aktualisieren. Das ist toll, wenn Sie eine einfache Bewegung haben, die leicht eine mathematische Formel beschrieben werden können mit der x(t) und y(t) (das heißt, sie nur zeitabhängig).

Eine weitere gute Idee ist, mit Punkt-Sprites anstelle von Dreiecken und Quads. Dies sollte die erforderliche Bandbreite auf der Pipeline auf ein Viertel reduzieren.


In meinem Raum sim habe ich den meisten trivialen Ansatz implementiert: Partikel als strukturierten Quads geschickt mit glBegin() / glEnd(). Sie werden in den aktuellen „Sektor“ als einzelne Objekte abgeladen und sind völlig unabhängig von dem Zeitpunkt an von Dumping. Dies ist die primitivste, dumm und idiotisch, was zu tun und ist für große Reduzierung der Leistung verantwortlich, zumal was ich durch Objekte über STL-Vektor des Iterators durchlaufen haben und nacheinander jede und jeder von ihnen senden.

Sie müssen sich überlegen, wie viele Partikel Sie wollen, und was wollen Sie ihnen zu tun. * Haben Sie sie in die Umgebung reagieren wollen und kollidieren? Dann müssen aktualisiert werden Sie auf CPU verarbeitet und Daten gesendet immer und immer wieder. * Haben sie in der dümmste Weise umfliegen nur möglich? Dann können Sie in der Lage sein, mit dem Senden alle Partikel wie VBO wegzukommen und TBO, und aktualisiert sie in Shader.

Viel Spaß!


aktualisiert auf den Kommentar # 1 von Fragestellern beziehen: -)

Was ich tun würde, ist die KISS. Das bedeutet: eine Klasse genannt ParticleEmitter einen Vertex-Array enthält, eine Reihe von Geschwindigkeiten, und eine STL vector mit Instanzen von einfachen Beschleunigern, wie beispielsweise Flugzeug, Kugel, Dreieck. Darüber hinaus hat einen „globalen“ * STL vector mit Beschleunigern. Aktualisieren Sie dann die Geschwindigkeiten nach Beschleunigern.

einen anderen STL-Vektor in ParticleEmitter mit Affektoren und andere „global“ STL vector mit Affektoren:

Ähnliche kann mit Affektoren (Schwerkraft, Wind und so weiter) erfolgen.

Affektoren und Beschleuniger wären Klassen, die affectParticle(particle_t*) implementieren würde. wo struct particle_t { float x,y,z; float vx,vy,vz; }. Ich würde es eine POD-Struktur halten, und laufen in ParticleEmitter::update() zu aktualisieren.

Allerdings, wenn Sie diese auf dem iPhone laufen, könnte es overcomplication werden? Vielleicht können Sie weg mit dem, was Sie bereits umgesetzt? Ich habe keine Ahnung, wie meine Design-Benchmark-Ergebnisse beeinflussen könnten, aber es klingt für mich vernünftig genug, wenn man die Partikel, Collider halten und Affektor count down, weil es klingt wie es mit etwa n*c+n*a skalieren können.

Dies sind nur meine Ad-hoc-Gedanken, und wie würde ich persönlich es umzusetzen. Ihr Design oder andere Leute Design, wäre wahrscheinlich besser: -)

* „Global“ unter Anführungszeichen, weil es wahrscheinlich Sinn machen würde, den Einsatz von jedem Raum zu machen Partitionieren Sie im Einsatz haben.

Ich habe das gleiche gute Design für meinen eigenen Motor in C ++ implementiert. Ich habe nicht mit Referenzen und Template-Richtlinien - statt (Strategien Alexandresku des „Modernen C ++ Desing“ lesen). Statische Polymorphismus gibt eine bessere Leistung.

Ich möchte ein paar Anmerkungen machen nach meiner Erfahrung.

  1. Traditionell meisten Partikel verwendet AOS (Array von Struct), um die Partikel Attribute zu speichern. Aber das ist vielleicht nicht die beste Entscheidung sein. Die Verwendung von SOA (Struct von Array) Darstellung gibt Ihnen viel Flexibilität für Attribute jedes Partikel-System hinzugefügt wird. Und auch, werden Sie viel einfacher, die Leistung mit SIMD mit SOA zu verbessern. Zum Beispiel tun 4 Partikel mit SSE-Befehle zusammen.
  2. Position, wo das Teilchen emittiert nur die Initialisierung eines Partikel Attribut. Wenn Sie Partikel emittieren, müssen Sie wahrscheinlich andere Attribute, wie Lebensdauer initialisieren, Geschwindigkeit usw. können Sie abstrakt all diese Funktion als initializers. Für Position können Sie einen Datenträger initializer, Box initializer haben, etc.
  3. Einige moderne Partikelsystem nimmt das Konzept der Veranstaltung. Partikelsystem kann Ereignis erzeugen (z.B. mit regen terrain kollidieren) und anderes Partikelsystem kann eine Aktion durchzuführen und hört (z emittieren splash).

By the way, ich glaube, der beste Weg ist, durch das Design der bestehenden Anwendung / Middleware zu studieren und auch durch Experimentieren.

scroll top